MYSQL-约束

目录

🌿前言:

[🌿非空约束(not null)](#🌿非空约束(not null))

🧊创建表,并查看表结构

🧊验证

🌿默认约束(default)

🧊创建表,并查看表结构

🧊验证

🍋‍🟩指定age字段的数值

🍋‍🟩不指定age字段,让SQL给它默认值

🌿唯一约束(unique)

🧊创建表,并查看表结构

🧊验证

🧊注意:

🍋‍🟩重复插入两条不指定sno字段的数据行,SQL语法正确!!

🍋‍🟩重复插入两条指定sno字段值为null的数据行,SQL语法报错!!

[🌿主键约束(primary key)](#🌿主键约束(primary key))

🧊创建表,并查看表结构

🧊以下面的这个表为基准

🧊没加自增(auto_increment)和加了自增(auto_increment)的不同点

🧊替换,如果存在冲突则替换,不存在冲突则插⼊

🍋‍🟩语法:

🧊复合主键:

🍋‍🟩创建带有复合主键的表

🍋‍🟩插入两条相同的数据行,会触发复合主键的约束,从而SQL报错

[🌿外键约束(foreign key)](#🌿外键约束(foreign key))

🧊语法:

🧊创建主表和与之相关的外表

🧊主表

🧊外表

🧊删除主表行时,不能先删除已经和外表建立关系得数据行

🌿check约束

🧊注意

🧊创建check约束

🧊正例

🧊反例


🌿前言:

在讲约束之前,先把一个数据库-库和表的操作的相关知识点讲完,

**问题:**我们在使用数据库的时候,可能突然忘记或者需要检查当前使用的是哪个数据库

查看当前使用的数据库

语法:

select 数据库名();



约束

注意:

每个约束我都创建了一张新表,可能名字跟上一个讲约束的表名相同,但实际上我是先drop掉旧表,create了个新表!!!共有6大约束!!!


🌿非空约束(not null)

🧊创建表,并查看表结构

设置id和 name这两个字段,只将name字段设为not null约束的

🧊验证

插入一条name为null的数据,SQL语法报错

如果不指定name的值呢,就是只插入id值,name值让SQL默认

这个就是name不能为空,而我们又没有指定该字段的数值,所以本来不写not null时SQL会默认给它个null值,而我们写了not null,且我们没有指定该字段的数值,所以SQL也不知道该写啥,故而报错

也就是设置了为not null的字段,插入数据行时,必须指该字段的值!!!


🌿默认约束(default)

🧊创建表,并查看表结构

🧊验证

🍋‍🟩指定age字段的数值

🍋‍🟩不指定age字段,让SQL给它默认值


🌿唯一约束(unique)

🧊创建表,并查看表结构

🧊验证

由于unique所修饰的字段,不能出现重复的字段数值,所以SQL报错

🧊注意:

🍋‍🟩重复插入两条不指定sno字段的数据行,SQL语法正确!!

🍋‍🟩重复插入两条指定sno字段值为null的数据行,SQL语法报错!!

总结:

默认的null不报错,指定的null等等报错


🌿主键约束(primary key)

🧊创建表,并查看表结构

注意:not null和unique的先后顺序可以变动,不影响两者构成主键约束(primary key)

🧊以下面的这个表为基准

🧊没加自增(auto_increment)和加了自增(auto_increment)的不同点

没加的,往主键里写入null,直接报错!!!

加了的,往自增主键里写入null,写入成功,不报错!!!

而且,自增主键不管写没写入null,都不会报错,都从1开始往后自增,且受插入记录的影响!!!

记住:只对null生效,其它的任何值都会受此约束的影响!!!


🧊替换,如果存在冲突则替换,不存在冲突则插⼊

🍋‍🟩语法:

replace into 表名(字段1,字段2~~) values(数值1,数值2~~);

介绍:只要表里的数据行与要插入的数据行有冲突,就替换原来的数据行,但它不是严格意义上的将冲突的数据行删除,把要插入的数据行放到已经删除行的位置上,而是将冲突的数据行删除,然后把要插入的数据行默认插入最后面

一个表里也不能有2个和2个以上的主键,如果有SQL会报错!!!

🧊复合主键:

🍋‍🟩创建带有复合主键的表

🍋‍🟩插入两条相同的数据行,会触发复合主键的约束,从而SQL报错

想不想同由id和name共同决定!!!


🌿外键约束(foreign key)

🧊语法:

foreign key (当前表的字段名q) references 主表(字段名q)

注意:两个表的字段名不要求要相同,且这个只能在本表也就是外表定义,主表上不能定义

🧊创建主表和与之相关的外表

🧊主表

🧊外表

我们可以发现由于主表上没有id为4的数据行,所以当外表插入数据行时,SQL语法会检查主表存不存在这个id值得数据,有,则插入成功,没有,则SQL报错

🧊删除主表行时,不能先删除已经和外表建立关系得数据行

这个是id为2的已经与在外表id为2建立了关系,所以不能删除

删除主表行时,可以删除已经和外表没有建立关系得数据行

删除表的话,一般先删除外表,再删除主表!!!


🌿check约束

🧊注意

在8.0.16开始全⾯⽀持CHECK约束,之前的版本会忽略CHECK的定义

🧊创建check约束

🧊正例

🧊反例


🧊🧊🧊完结!!