一。为什么要有表的约束?
在上一篇文章中,我们认识了很多的数据类型,并在它们的下面通过例子进行了演示,向表中插入一些不合法或超出范围的数据。
MySQL 会拦截不符合当前数据类型的操作。换句话说,数据类型在无形中形成了一种'约束',只要插入的数据不在约束之内,MySQL 就会进行拦截。
通过约束,可以保证未来插入数据库表中的数据是符合预期的。约束的本质就是通过技术手段,倒逼程序员插入正确的数据。凡是插入进来的数据,都是符合数据约束的。
二。表的约束
单单只通过数据类型来进行约束是不够的,还需要有更多的约束条件。
2.1 空属性
一般有两个值:null(默认的)和 not null(不为空)。
与之相关的其实就是使用 desc 指令查看表的属性中 Null 这一列,默认情况下这一列的内容都是 YES,表示该属性数据可以为空。
怎么让一个属性的数据不能为空,即 not null?在表的属性后面加上 not null 就可以将该属性设置为 not null。再次通过 desc 指令查看表的属性,可以看到 Null 这一列的内容就不再是 YES,而是 NO,即该属性对应的数据不能为 null。
当我们向其中添加数据的时候,如果想要插入的数据是 NULL,也就是为空,那么 MySQL 会拦截并报错,说明 name、id 这一列不能为空。
2.2 默认值
默认值:某一种数据会经常性地出现某个具体的值,可以在一开始就指定好,在需要真实数据的时候,用户可以选择性地使用默认值。
这个默认值可以认为是 C++ 语法中的缺省值,当没有传入该参数的实参时,就会使用声明或定义时所设定的缺省值。
默认值在表的属性中也出现了,Default 这一列表示的就是默认值。设置默认值的方法就是在属性后面加上:default + 默认值。
插入数据时,有的属性并没有显式地传入,但从结果来看也成功地插入了数据,那些没有显示插入的数据,用的就是创建表时设置的默认值。
关于 not null 和 default 是否冲突:它们是不冲突的,反而互补。not null 的前提是向表中插入数据,但是插入的数据不能为空;而 default 是不向表中插入数据,那么才会使用 default。MySQL 支持 not null + default 的写法,即如果要插入数据,那么插入的数据不能为空,如果不插入数据,那么就使用默认值。
2.3 列描述
列描述:comment,没有实际含义,专门用来描述字段,会根据表创建语句保存,用来给程序员或 DBA 了解。
通过 comment 描述,就能知道所对应的属性是干什么的。通过 desc 指令看不到属性所对应的 comment 描述,可以通过 show 指令来查看一个表被创建的相关语句,就能看到每个属性的 comment 描述。
列描述并没有像 not null、default 那种不满足条件时 MySQL 会拦截报错的情况,而只是给程序员描述该属性是什么含义。
2.4 zerofill
zerofill 跟数据类型有些关系。int 类型的后面跟了一个 (10),这个 10 代表什么意思呢?
更改 a 属性的类型,在其后面加上 zerofill 关键字。向里面插入一些数据后,查看表中的数据,可以发现 a 的数据从 123 变为了 0000000123。
出现这种现象的原因正是因为 zerofill 起作用了,int 后面括号中的 10,表示的是宽度为 10,而 zerofill 的作用就是:如果插入的数据宽度小于 10,那么就会在前面的空位上自动补 0。
这只是最后显示的结果,实际在 MySQL 中存储的依旧是 123 和 1234,不必担心使用 zerofill 后实际存储的值会发生变化。
如果插入的数据宽度超过了 int 后面括号中的数字呢?当插入的数据的宽度>=int 括号中的数字的时候,就不再自动补 0 了,此时就和不加 zerofill 是一样的效果了。
为什么 int 类型括号后面的数字默认是 10 呢?思考 int 类型的范围是多少其实答案就已经出来了,即 -2 的 31 次方到 2 的 31 次方 -1,也就是 -21 亿~21 亿,21 亿这个数字的宽度是 10 位,这个 10 对应的正是 int 括号中的 10。
在上面设置 a 和 b 的类型的时候,在后面加上了 unsigned,所以 int 后面括号中的数字是 10。如果把 unsigned 去掉,那么括号中的数字将会变为 11。原因是加上 unsigned 表示无符号,而去掉 unsigned 后将变为有符号,所以会多个符号位,也就从 10 变为了 11。
2.5 主键
主键:primary key 用来唯一的约束该字段里面的数据,不能重复,不能为空,一张表中最多只能有一个主键;主键所在的列通常是整数类型。
设置的方式很简单,在属性的后面加上:primary key 即可将该属性设置为主键。通过 desc 指令查看表的属性,可以看到 id 属性在设置了主键后,就不能再为空了。
当想要插入相同 id 的数据的时候,MySQL 就会拦截,因为主键属性是不能重复的。
如果创建表的时候并没有设置主键,在后面要想将表中的某个属性设置为主键,可以用 alter 指令,并且后面要使用 add,表示要向表中添加一个主键,在括号中填入要设置的属性。


