目录
1.删除操作
1.1表的删除操作
1.2数据库备份
2.约束
2.1基本概况
2.2not null约束演示
2.3unique约束演示
2.4default约束演示
2.5primary key约束演示
2.6foreign key约束演示
2.7check约束演示
1.删除操作
1.1表的删除操作
delete from 表名 where 条件(可以搭配order by,delete)
会把符合条件的行从这个表里面删除掉
drop tabel---删除表操作;
drop操作就是直接把这个表删除了,这个表根本就不会存在于这个数据库里面了,但是我们的delete是把表里面的记录删除掉,但是这个表还是存在的;
delete table(名字)--可以进行表的记录删除,但是这个表还是存在的;
delete和update都是持久化的操作,会影响到我们的数据库服务器的磁盘里面的数据,因此这个草最一定要谨慎,但是像这个insert之类的这个操作只是临时的,不会影响到我们的数据库磁盘上面的数据;
1.2数据库备份
数据库的备份:这个我们使用mysqldump进行演示,这个mysqldump实际上就在我们的这个mysql的安装包的这个bin目录的下面,小伙伴可以自己去找一下,这个就是一个mysql自带的程序,这个就是可以把我们的SQL雨具导出为一个.sql文件;
这个备份的这个命令里面是有这个我们登录进入数据库的这个指令的,因此我们的备份是在最原始的这个窗口执行------而不是在mysql->这个情况下执行的;
我们的这个hsp_db02和db03就是我们想要备份的数据库的名字,后面的这个类似于重定向的符号就是我们要备份到的位置,这个位置到时候就会生成我们的这个.sql文件,这个文件里面的内容就是我们的创建修改数据库里面的这个表的相关的这个sql语句;
我们使用下面的这个进行数据库的恢复:
source 路径---------------恢复的语句
我们的这个备份是在dos下面执行的,不是mysql->的这个情况下,这个时候我们还没有进入我们的数据库;
但是我们的这个source进行数据库恢复的时候,就需要先进行登录,在mysql->下使用这个source语句进行数据库的恢复;
2.约束
2.1基本概况
数据库对于数据进行校验和检查的工作机制-------------保证数据库里面不被插入非法的数据;下面的这个就是Mysql里面的一些约束:
not null----不可以是空的;
unique--------不可以重复;
primary key----------主键,不可以是空的,而且不可以是重复的;
2.2not null约束演示
我们首先创建一个简单的数据库里面的表:stu2;我们创建的这个表有两列,一列表示这个表的id,一列表示的就是我们的学生表的名字;
我们的这个创建的时候指出来这个id不可以是空的,具体的写法如图所示:
这个not null就是对于这个表的一个约束,这样的话,我们如果对于这个表进行一些不正当的操作,就会报出错误信息;下面的就是我们插入一个空值,这个时候的id就是null,这个时候触发我们的约束,这个时候就会报错;
我们的这个表里面有一个姓名为张三的同学的信息,我们把这个同学的id修改为null,这个时候也是会触发我们的约束,因此这个时候也会报错;
2.3unique约束演示
uniuqe就是表示的不可以重复,我们可以进行测试的:
就是我们先不加任何约束进行一个表的创建,这个时候连续向这个表里面插入相同的元素,这个操作是不会报错的;
但是如果我们创建表的时候加上这个unique的约束,这个时候如果我们还是连续两次插入相同的数据,这个时候就会报错,如下图所示:
unique进行约束的时候,首先会进行查询的操作,看看我们插入的这个数据是不是和这个表里面的已知的数据是重复的,因此这个数据库里面的约束的引入,增加了我们数据插入的时候的查找校验时间,某种程度上也降低了我们的执行效率;
2.4default约束演示
我们首先看一下这个一般情况下我们的这个表的相关的属性的信息,这个是使用
desc 表名----------------查询这个表的相关的属性的信息;
我们可以看到这个查询结果里面的这个default这一列就是null,这个default就是默认的意思;
我们的这个desc表示的是describe就是描述的意思,和我们的英文单词的意思一样;
但是之前的那个对于这个表进行查询的时候,这个里面有一个对于这个表数据进行排序,我们的这个desc表示的就是降序排列,两个虽然写法一样,但是这个实际含义不一样,这个降序排列里面的这个desc表示的就是descend这个单词,因此这个提示我们为了避免引起歧义,我们尽量不要使用所写的方式,如果使用,尽量不要出现相同名字的现象;
上面的这个现实的效果是我们的这个default这一列的默认的结果都是null,其实这一列的内容我们是可以进行修改的,例如我们把这个名字的默认值修改为‘未命名’,修改时候对应的SQL语句如下
然后我们使用这个desc语句对于这个表的属性信息进行查询,发现这个时候的默认的内容已经被修改过来了;
2.5primary key约束演示
这个primary就是主要的意思,key就是键的意思,因此这个合起来就是主键的意思;
主键兼顾了我们的上面的not null和这个unique的功能,就是这个主键既不可以是空的,也不可以是一个重复的数值,就是unique和not null需要满足的条件,这个primary key都必须满足,因此可见这个主键的限制性比较强;
按照上面的这个SQL语句,我们把这个id设置为主键,这个时候我们使用这个desc对于这个逐渐的相关的信息进行查询,使用的就是我们上面的这个desc,这个时候发现id这个属性里面的key对应位置有了一个pri的表示,这个pri就是primary的意思,可见这个时候我们的主键的设置已经生效了
我们编写SQL语句对于这个表进行内容的插入,第一个参数写成这个null表示的就是把这个id让数据库服务器自己给我们的这个插入的内容进行自行分配,并不是null的真正的含义(不要误解,反正这样写不会报错,按理讲这个primary key需要满足这个not null的要求,但是这个地方没有报错)~~
我们下面介绍一下这个自增主键,然后再向这个表里面插入数据,这个自增逐渐的单词就是auto_increment,这个表示的就是自动增长;
我们第一次插入lisi,id让这个数据库服务器自动分配,第二次插入wangwu,第三次插入tom,第三次插入的时候指定了这个对应的id,我们使用这个select语句显示这个表的相关的信息,我们就可以看到,如果我们没有指定这个id,在这个自增主键约束之下,我们的这个id就是按照1234的这个顺序增加的,但是这个如果我们自己进行了指定,这个时候就会显示我们指定的内容作为id;
这个时候我,如果我们再次去插入数据,这个时候的id会从11开始增加,而不是原来的3,因为我们的这个id的自增,看的是这个数据库的表里面的最小的id,然后以这个作为基准进行增加;
但是,这个并不意味着我们的4-10这个下标就全部浪费了,如果我们进行手动的这个id的指定,这个效果还是可以实现的,但是如果我们呢让这个数据库服务器进行分配,这个时候的id就无法利用4-9这个范围的下标了;
下面的是一个拓展的知识:我们想要向这个数据库的表里面插入id,这个id作为我们的主键,肯定是不能重复的,但是我们实际的服务器是多个主机,分库分表,这个时候每一个表都是相互独立的,互相看不到彼此,这个时候我们的id只会插入到一个表里面去,怎么保证这个插入的id不和另外的两个表里面的这个id重复呢?
这个就不得不说一下我们的分布式系统的生成唯一id的算法:时间戳+主机编号+随机因子;
如果添加新的商品的速度很慢,这个时候时间戳就可以解决问题,但是如果速度很快,这个时候可以通过不同的主机编号进行区分,再多的话就是是生成随机因子,这样三者的组合大部分情况下就可以生成唯一的id了;
2.6foreign key约束演示
foreign表示的就是外国的意思,因此这个foreign key就是外键的意思,外键约束就是这个已知的表和这个数据库里面的其他的表建立联系的过程;下面的这个就是一个数据库里面的两个表,一个是class表,一个是student学生表,这个class表里面包含的信息就是我们的这个classid和我们的班级的名字,student学生表里面的信息就是我们的学生的id和学生姓名,学生班级的id信息;
这个里面,我们的class这个表就是一个父亲表,student就是一个儿子表,因为这个里面的student的这个classid这个内容必须来自于我们的这个class这个里面的classid这一列,否则这个是不合理的,而我们的这个外键约束就是用来形容的这个过程;
按照上面的这个过程,我们首先创建一个class表,这个里面包含了我们的classid和我们的name(班级的名字),下面的这个就是使用的insert进行这个数据的插入的过程;
翻车说明
刚刚实操了一下,上面的这个设置是有问题的,我们想要把这个classid和student这个表里面的classid相互连接,这个class表里面的这个class必须设置为主键,否则我们在这个student这个表里面进行外键设置的时候就会报错(这个我当时弄了好久,在博客上面找,发现其他的这个博主给出来的答案或者是解决方案都是这个编码方式的问题,但是我重新设置这个utf8编码方式之后,这个依然还是会报错,后来才了解到这个class表里面需要进行这个主键的设置,因此这个告诉我们,当我们想要两个表里面的某一类进行外检约束的时候,两个表里面的这个进行外键约束的列必须要自己所在的这个表里面的主键,两个表里面都需要进行设置,否则就会报错!!!!!!!!!)
下面的这个是我们对于这个class里面的这个主键进行设置的情况演示:我们把这个classid设置为主键primary key;
下面的这个就是在进行主键的设置:我们的这个student这个表里面,一共是有三列的,分别是这个学生的id,学生的姓名name,学生的classid,其中这个classid就是外键,和其他的这个约束不一样的是,我们的foreign是需要使用逗号和前面的分隔开,其他上面的约束是直接添加在了后面
references表示的就是外键约束,后面跟的这个就是我们的这个受到class这个表里面的classid这一列的内容的约束(儿子表在前面,父亲表在后面!!)
这个时候如果我们插入了106班,这个classid在我们的这个class这个表里面显然是不存在的,因此这个时候就会报错;如果我们把这个class这个表里面的内容删除掉,这个时候,可能也会影响我们的这个外键约束,例如我们的这个class里面的102被删除了,但是我们的这个student里面的这个classid=102就没有对应的了,但是我们的这个student里面的这个是我们的class表存在102的时候创建的,这个删除之后我们的儿子表里面就没有参考了;
正确做法是:我们可以先去删除这个儿子表,再去删除这个父亲表,这样才会被允许操作;
下面的这个是一个电商网站的情景,这个里面就有用到我们的这个外键约束,因为我们下单的这个商品的id需要是在这个数据库的商品表里面存在的,因此这个就构成了外键约束,但是如果的这个商家下架了这个商品,我们的购买记录里面还是可以看到这个商品的信息,但是这个时候商品表里面已经没有了;
这个实际上就是我们的这个表里面新增加了单独的一列,表示这个商品在线或者是不在线,如果是下架这个商品,这个时候就是把这个列对应的内容从1->0就可以了,查询商品的时候,我们就查询不到了,但是这个就是间接的隐藏,实际上这个商品的信息还是存在的,只不过我们看不到了;
2.7check约束演示
mysql里面使用这个check语句可以进行检查,但是这个约束会被忽略,了解即可;
create table test1(id int name varchar(20),sex varchar(1),check (sex='男' or sex=‘女’));