MySQL 表约束详解
一、为什么要有表的约束?
在上一篇文章中,我们认识了很多的数据类型,并在它们的下面通过例子进行了演示。在这些例子中,我们向表中插入了一些不合法或超出范围的数据。
结果可以看到,MySQL 会拦截我们的操作。这是因为我们要插入的数据不符合当前数据类型的约束。只要插入的数据不在约束之内,MySQL 就会进行拦截。
为什么要有表的约束?
答案是通过约束,可以保证未来插入数据库表中的数据是符合预期的。约束的本质就是通过技术手段,倒逼程序员插入正确的数据。站在 MySQL 的角度,凡是插入进来的数据,都是符合数据约束的。
二、表的约束
单单只通过数据类型来进行约束是不够的,还需要有更多的约束条件。
2.1 空属性
一般有两个值:null(默认)和 not null(不为空)。
与之相关的其实就是使用 desc 指令查看表的属性中 Null 这一列,默认情况下这一列的内容都是 YES,表示该属性数据可以为空。
如何让一个属性的数据不能为空?在表的属性后面加上 not null 即可将该属性设置为 not null。设置后再次通过 desc 指令查看,Null 这一列的内容将变为 NO。
验证:当尝试插入 NULL 时,MySQL 会拦截并报错,提示该列不能为空。
2.2 默认值
默认值:某一种数据会经常性地出现某个具体的值,可以在一开始就指定好,在需要真实数据的时候,用户可以选择性地使用默认值。
默认值可以认为是 C++ 语法中的缺省值,当我们没有传入该参数的实参时,就会使用声明时所设定的缺省值。
在表的属性中,Default 这一列表示的就是默认值。设置默认值的方法是在属性后面加上 default + 默认值。
如果插入数据时没有显式传入该字段,系统会使用创建表时设置的默认值。
关于 not null 和 default 是否冲突:它们是不冲突的,反而互补。
not null:前提是要插入数据,但插入的数据不能为空。default:如果不向表中插入数据,则使用默认值。
MySQL 支持 not null + default 的写法。如果要插入数据,则不能为空;如果不插入数据,则使用默认值。
2.3 列描述
列描述:comment,没有实际含义,专门用来描述字段,会根据表创建语句保存,用来给程序员或 DBA 了解。
通过 show 指令可以查看一个表被创建的相关语句,从而看到每个属性的 comment 描述。
列描述并没有像 not null、default 那样在不满足条件时拦截报错,只是给程序员描述该属性是什么含义。
2.4 zerofill
zerofill 关键字用于控制整数显示格式。
当通过 show 指令查看创建表信息时,int 类型后面跟了一个 (10),代表宽度为 10。
如果在属性类型后面加上 zerofill 关键字,向其中插入数据后,查看表中的数据,发现数据会自动补零。例如 123 变为 0000000123。
原因正是因为 zerofill 起作用了:如果插入的数据宽度小于指定宽度,会在前面自动补 0。
注意:这只是最后显示的结果,实际在 MySQL 中存储的依旧是原始数值。
如果插入的数据宽度超过了 int 括号中的数字,就不再自动补 0,效果等同于不加 。


