MYSQL-约束
目录
🌿前言:
🌿非空约束(not null)
🧊创建表,并查看表结构
🧊验证
🌿默认约束(default)
🧊创建表,并查看表结构
🧊验证
🍋🟩指定age字段的数值
🍋🟩不指定age字段,让SQL给它默认值
🌿唯一约束(unique)
🧊创建表,并查看表结构
🧊验证
🧊注意:
🍋🟩重复插入两条不指定sno字段的数据行,SQL语法正确!!
🍋🟩重复插入两条指定sno字段值为null的数据行,SQL语法报错!!
🌿主键约束(primary key)
🧊创建表,并查看表结构
🧊以下面的这个表为基准
🧊没加自增(auto_increment)和加了自增(auto_increment)的不同点
🧊替换,如果存在冲突则替换,不存在冲突则插⼊
🍋🟩语法:
🧊复合主键:
🍋🟩创建带有复合主键的表
🍋🟩插入两条相同的数据行,会触发复合主键的约束,从而SQL报错
🌿外键约束(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约束
🧊正例
🧊反例
🧊🧊🧊完结!!