咱们聊一聊数据库中的表约束。这玩意儿说白了,就是数据库里必须得有一系列规则,通过这些规则,来保证将来塞进去的数据是准确、靠谱的。约束的本质,其实就是通过技术手段,逼着写SQL的人插入正确的数据,从而保证数据库里数据的准确性。
一、非空约束
非空约束就两个值:null(默认)和 not null(不为空)。数据库中的字段默认基本都是可以为空的,但实际开发中,尽可能让字段不为空——数据要是为空,根本没法参与运算,这是个很重要的小细节。
这里多说一句,null 和 '' 是两个完全不同的东西:null 是“什么都没有”,而 '' 是“有,但是空”。这区别得弄清楚。


二、default 约束
default,跟 C++ 里的缺省值差不多,就是可以给字段指定一个默认值。

那 not null 和 default 一起用会怎样?

这里得注意一下:如果咱们的表中没有设置 default 和 not null 约束,那它默认就是 default null;但如果设置了 not null,就不会再有 default null 了。
三、comment 列描述
列描述其实就是个注释,方便我们理解这个字段是干嘛用的。

四、zerofill 约束
关于 int(10) 这个写法,如果没有 zerofill 约束,其实没什么意义。


简单来说,int(10) 里的那个 10,就是限定数字的显示宽度。如果实际数字不足10位,就用0在前面补齐显示。
五、主键约束
主键,primary key,用来唯一标识该字段里的每一行数据。它不能重复,也不能为空,而且一张表里最多只能有一个主键。通常情况下,主键所在的列都是整数类型。

去除主键约束也很简单:

添加主键约束:

再说说复合主键。主键不是只能给一列设置,给多列设置主键,那就是复合主键。需要注意:复合主键是只有当那些设置了主键的列,同时与过往数据完全相同时,才会产生主键冲突。

六、auto increment 约束


auto_increment 这玩意儿,当对应的字段不给值时,系统会自动触发:它会从当前字段已有的最大值基础上加上1,得到一个全新的、不同的值。通常会跟主键搭配着用,作为逻辑主键。
自增长有几个特点必须注意:任何一个字段要自增长,前提是它本身是个索引(key那一列要有值);自增长字段必须是整数;一张表最多只能有一个自增长。
如果想自定义自增长的起始值:


如果想查看最后一次插入的自增长的值:

七、唯一键

主键不能为空,而唯一键可以为空,这就要再次强调一下:NULL 是“什么都没有”,它是不参与计算的。还有一点很重要:一张表只能有一个主键,但可以有多个唯一键。
八、外键


因为学生是从属于某个班级的,所以就需要外键来维系这种关系:


外键主要就是用来定义表与表之间的约束。创建外键时,主表必须有主键约束或unique约束,而外键约束定义在从表上。定义外键后,要求外键列的数据必须在主表的主键列中存在,或者为null。



总结
总的来说,MySQL的约束就是一套严格的规则,目的是保护数据的一致性和完整性。非空、默认值、主键、唯一键、外键……每一种约束都有它特定的场景和意义,理解了这些,写SQL的时候就知道如何“约束”自己,不让脏数据溜进数据库里。
