真正约束字段的是数据类型,但是数据类型约束很单一,需要有一些额外的约束,来更好地保证数据的合法性,从业务逻辑角度保证数据的正确性。
表的约束有很多,这里主要介绍如下几个:null/not null、default、comment、zerofill、primary key、auto_increment、unique key、foreign key 。
两个值:null(空)和 not null(非空)
数据库默认字段基本都是为空,但是实际开发时要尽可能保证字段不为空,因为数据为空没办法参与运算。
说明:在 MySQL 中,NULL 表示不存在(空),NULL != 0 != “” 。
① NULL 表示该字段是没有的,用户没填。
② 0 表示用户填的是 0 。
③ “” 表示用户填的是 “” 。
如果指定了字段为 not null,那么该字段必须得填,如果不填,就无法插入,直接报错。换言之,凡是在这个表里的数据,都是非空的。
default
若某个字段会经常性地出现某个具体的值,可以考虑将这个值设为该字段的默认值。
当向表中插入数据时,如果没有给带有默认值的字段设置值的话,会使用默认值进行插入。
not null 和 default 一般不需要同时设置,因为一旦给某个字段设置了 default,那么该字段就不会为空,此时再设置 not null 就没有意义了。
comment '注释信息'
没有实际含义,专门用来描述字段,会根据表创建语句保存,用来给程序员或 DBA 来进行了解。
zerofill
比如 int(10),其实如果没有 zerofill 这个属性,括号内的数字是毫无意义的。
设置 zerofill 属性之后,如果数据的宽度小于设定的宽度(括号内的数字),则会在数据前面自动填充 0 。
这只是设置了 zerofill 属性后的一种格式化输出而已,而实际存储不变。
primary key
用来约束该字段里面的数据:不能重复且不能为空,一张表中最多只能有一个主键。主键所在的列通常是整数类型。
primary key 是唯一的且为非空,所以一旦指定某个字段是 primary key,就不需要再指定 default 和 not null 了。
删除主键和增加主键:
复合主键:由多个字段作为一个主键。
只有作为主键的所有字段的列信息均出现冲突时,才是主键冲突。
auto_increment
设置了自增长属性的字段,若在插入时不给值,则系统会从当前字段中已有的最大值 + 1 后进行插入。
unique
一张表中往往有很多字段中的数据不能出现重复,需要唯一性的约束。但是一张表中只能有一个主键。而唯一键就可以解决表中有多个字段需要唯一性约束的问题。
唯一键和主键都能保证字段中数据的唯一性,但唯一键允许为空(空字段不做唯一性比较)。
唯一键约束字段中的数据不能出现重复,指的是不能出现重复的值。但 NULL 表示没有填,为空,所以就谈不上重复和冲突的问题。
唯一键和主键,它们唯一的区别是:是否允许字段为空。
如果对一个字段同时设置 not null 和 unique,那么它就是主键了。
主键 VS 唯一键:
主键和唯一键是互相补充的,为了可以设计出一个强约束的表。
示例:在业务层面上保证逻辑的正确性。
foreign key (字段名) references 主表(列)
外键:用于定义主表和从表之间的关系。
外键约束:主要定义在从表上,在主表中被外键关联的列必须是有主键约束或唯一键约束。
说明:当定义外键添加外键约束后,要求插入的外键列数据必须在主表对应的列中存在或为 NULL 。
外键 VS 外键约束:
示例:下面的 class 表是主表,stu 表是从表。
class 是主表,它的 id 字段是具有主键约束的。
下面的 stu 表的 class_id 字段是外键,与 class 表的 id 字段关联。
外键约束(结合下面的具体例子):
① 对想要插入 stu 表的一条学生记录,只有当它的 class_id 数据在 class 表中存在或为 NULL 时,该学生记录才能插入到 stu 表中,否则就会直接报错,插入失败。
② 如果想要删除 class 表中的一条记录,只有当 stu 表中对应于 class 表 id 字段的 class_id 字段数据全都被删除时,该记录才能被删除,否则就会直接报错,插入失败。