目录
[🌿非空约束(not null)](#🌿非空约束(not null))
🍋🟩重复插入两条不指定sno字段的数据行,SQL语法正确!!
🍋🟩重复插入两条指定sno字段值为null的数据行,SQL语法报错!!
[🌿主键约束(primary key)](#🌿主键约束(primary key))
🧊没加自增(auto_increment)和加了自增(auto_increment)的不同点
🍋🟩插入两条相同的数据行,会触发复合主键的约束,从而SQL报错
[🌿外键约束(foreign key)](#🌿外键约束(foreign key))
🌿前言:
在讲约束之前,先把一个数据库-库和表的操作的相关知识点讲完,
**问题:**我们在使用数据库的时候,可能突然忘记或者需要检查当前使用的是哪个数据库
查看当前使用的数据库
语法:
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约束

🧊正例

🧊反例

🧊🧊🧊完结!!