MySQL中常见的六个约束类型详解
⽬录
前⾔
2.unique
3.default
4.primarykey
⾃增主键auto_increment
5.foreignkey
6.check
总结
前⾔
在向数据表中插⼊数据时,有的时候对于插⼊的数据是有特殊要求的,⽐如学⽣成绩不能为空,学⽣学号不能重复等等,这个时候约束就派上⽤场了。
约束类型是通过对表的⾏或列的数据做出限制,来确保表的数据的完整性、唯⼀性。这⼀章我们主要介绍六个常见的MySQL约束类型。
1. not null
保证指定不能存储NULL值,如果插⼊NULL则插⼊失败。
我们定义两张数据表,分别是student表和student_copy表,student表设定相关约束,student_copy表作为其对照表,不设置任何约束来观察两者的区别。
student表中id定义了not null,所以id这⼀⾏的NULL = NO,意思是这⼀⾏数据不能为NULL,否则会插⼊失败。
student_copy表中没有进⾏任何约束,所以任何字段的NULL = YES,意味着⽤户可以随意插⼊空值⽽不会报错。
Q:not null约束下除了显式的指定插⼊NULL会报错外,隐式的NULL会报错吗?
NULL指定有两种⽅式,分别是显式和隐式。
显式指的是插⼊时设定该列为NULL,⽽隐式指的是插⼊时对该列没有赋值,⽽这⼀列⼜没有指定默认值,系统默认的默认值是NULL,所有这中情况下也会触发插⼊控制的错误。
2. unique
保证某列的每⾏必须有唯⼀的值,也就是说,指定列的每⾏数据都不能重复。
下⾯两张图分别是对student表和student_copy表的操作,student表的id列设置了unique约束,所以在插⼊同样的id = 1时会显⽰重复操作。
student_copy表中没有进⾏任何约束,意味着⽤户可以随意插⼊任意值⽽不会报错。
Q:unique约束下插⼊NULL值会报错吗?
其实这个问题在刚才已经操作过了,student表中插⼊id = NULL,系统并不会报错。unique只是保证存储的值唯⼀,它可以是空值,但空值也得唯⼀,再插⼊NULL就会报错。
3. default
规定没有给列赋值时的默认值,换句话说就是,插⼊数据时没有给指定列的值,那么其值就是defalut指定的默认值。
student表指定了name字段设置了default约束之后,default这⼀列就有了名字。当插⼊数据时,没有指定name这⼀列,那么name这列就会按照我们设置的默认值 = '未命名'来填充。
⽽student_copy表没有设置default约束,所以当插⼊数据时,没有指定的列会按照系统默认的默认值来填充,也就是NULL。
4. primary key
not null + unique 的结合,保证某列具有唯⼀标识且不能存储NULL值。
前⼏个约束类型都是可以同时给多个列设置的,但是primary key⼀张表中只有能约束⼀列,使⽤primary key约束的列被称为主键。和unique类型,插⼊的数据如果重复了,那么后⼀条数据会插⼊失败,并且插⼊的数据不能为NULL。
mysql创建表数据类型⼀个表中只能由⼀列时主键,不能同时有多列是主键。设计表的时候,⼀般最好设定⼀个主键,常见的主键都是数字形式的。
⾃增主键auto_increment
在实际开发中,往往有⼀系列的策略来保证主键不重复,最常见的⽅法就是设置⾃增主键,系统可以⾃动给数据分配,⽤户也可以同时⼿动进⾏⼲预,因为MySQL中内置了⾃增主键功能,所以使⽤⾮常简单.
下图中id这⼀列就变成了⾃增主键,⽤户在插⼊数据时,就可以不必⼿动⼲预了.
Q:执⾏以下操作,猜想该表的查询结果是什么?
已知Id字段设置为⾃增主键.
张三的id = null,由于⾃增主键按照顺序它的id = 1;李四的id = 1,主键不能重复,李四的id和张三的id重复,所以插⼊失败;继续插⼊李四数据,此时设置id = 4,没有和原有数据重复,所以插⼊成功;
王五的id = null,按照⾃增主键接着上⼀个顺序往下⾛,所以它的id = 5;
那么我们来看⼀下结果:
5. foreign key
外键⽤于关联其他表的主键,保证⼀个表中的数据匹配另⼀个表中的值的参照完整性。
foreign key (字段名) references 主表(列)
下⾯我们举个例⼦来理解下,我们现在创建两张表并想把它们关联起来,应该如何操作呢?
⾸先思考⼀下这个对应关系,⼀个学⽣对应⼀个班级,⼀个班级对应多个学⽣.在学⽣表中id为主键,那我们可以设置学⽣class_id为外键,去关联⽐班级表.
创建班级表class,设置classsId为主键
create table class (
id int primary key auto_increment,
name varchar(20)
);
创建学⽣表student,设置id为主键
create table student (
id int primary key auto_increment,
name varchar(20),
class_id int,
foreign key (class_id) references class(id)
)
;
MUL表⽰外键约束;
外键的使⽤规则
学⽣表中的插⼊的班级Id,必须在班级表中存在;
班级表是空的,这个时候插⼊学⽣表数据并给class_id = 1,⽽班级号在班级表中是空的,所以插⼊失败.学⽣表指定的这个外键约束,必须是班级表的主键;外键约束建⽴好了以后,此时班级表中的班级id就不能再随意修改或删除;
我们⽆法将班级表中id = 1的记录修改为id = 20,因为学⽣表中的张三依赖于班级表id = 1这样的结果.
外键的缺点
加⼊假如我们有下⾯这样⼀个商品-订单关联的两张表

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。