一、概念
为什么要对表进行约束?首先这种约束本身是对数据类型的限制,只接受设定好的数据类型,保证数据的合法性。但是这样还不够,为了保证数据的合法性和数据在业务逻辑上的正确性,就需要约束!
二、常见的约束
1.空属性
这个属性的作用是决定一个字段可不可以为空。分为两个值:null 和 not null。默认情况字段的空属性都为NULL:

在一些情况下,字段的内容不能为空,比如一张班级表,班级有名字和教室号,一个班级只要存在,这两个字段就本不应该为空:

插入数据时,不给具体的数据就无法插入:

2.默认值
在某种情况下,一些数据会经常是某个具体的值;像这样的数据可以一开始就给定,插入数据时可以选择忽略,自动设置为默认值;如果具体给出,那就用给出的数据。

default 和 not null:
not null表示数据不能没有,不能为NULL;default表示不给出数据就设定为默认值;二者并不冲突,是一种补充关系。如果同时设置default和not null,那就是数据不能为NULL,如果忽略不给,那就为默认值!
3.列描述
列描述是用来描述字段的,这种描述主要是给程序员看的,对表本身没有什么意义。

4.zerofill
zerofill可以理解为一种格式化输出的方式,某些数据类型(比如int)会有位数设置,你不设置zerofill,这个数是多少就是多少;如果设置了zerofill,数值大小不变,只是其他位数上的数字全部用"0"填上。


这个位数并不是数据类型的范围。
三、重要的约束
1.主键
主键的是标识并且是唯一标识表示某个字段或者字段集合的属性。一个表中只能有一个主键,被主键修饰的值不能重复,不能为NULL。主键修饰的字段通常是整数类型。
注:主键虽然只能有一个,但可以修饰多列,这样的主键被成为复合主键

可以看到:被主键修饰的字段,不能重复,也不能为空。
删除主键属性:
alter table 表名 drop primary key;

给没有主键的表添加主键:
alter table 表名 add primary key(字段列表);

当然,show create table命令让我们看到了MySQL主键的创建方式;
复合主键:
在创建表的时候,在所有字段之后,使用primary key(主键字段列表)来创建主键,如果有多个字段
作为主键,可以使用复合主键。

2.自增长
auto_increment:修饰的字段,不给值,会自动的被系统触发,系统会从当前字段中已经有的最大值+1操作,得到一个新的不同的值。通常和主键搭配使用,作为逻辑主键。
自增长的特点:
任何一个字段要做自增长,前提是本身是一个索引(key一栏有值)。
自增长字段必须是整数。
一张表最多只能有一个自增长。

在插入后获取上次插入的 AUTO_INCREMENT 的值(批量插入获取的是第一个值):

3.唯一键
一张表中有往往有很多字段需要唯一性,数据不能重复,但是一张表中只能有一个主键:唯一键就可以解决表中有多个字段需要唯一性约束的问题。
唯一键的本质和主键差不多,唯一键允许为空,而且可以多个为空,空字段不做唯一性比较。
唯一键与主键的区别:
主键是用来标识唯一性的,这些字段往往天然就具有唯一性;
唯一键更多是业务逻辑上,有些信息不能重复,需要唯一。
例如,一个人的身份证号和手机号都需要唯一性,但身份证号天然具有唯一标识一个人的作用,适合当作主键!

4.外键
外键用于定义主表和从表之间的关系:外键约束主要定义在从表上,主表则必须是有主键约束或unique 约束。当定义外键后,要求外键列数据必须在主表的主键列存在或为null。
怎么理解外键?就像人一样,人不是绝对孤立的个体,人与他者之间有关联,行动时需要受到约束;一张表维护的字段,可能与另一张表维护的字段有相互限制的关系,不能单纯的自己想怎么操作就这么操作;外键就是用来解决这样的问题的。
语法:
foreign key (字段名) references 主表(列)
例:

像学生和班级之间就存在一些关系:学生的class_id必须存在,这个班级还有学生,就不能删除这个班级等。而且一个班级对应很多学生,班级为主表,学生为从表。



正常插入数据:


外键约束:

不存在班级id为200的班级,无法插入!

插入一个学生数据,班级还未分配!

无法删除该班级(id=100),里面还有学生的数据!
感谢浏览!!