1.MySQL表的约束概述
• 真正约束字段的是数据类型,如果插入的数据超出了对应数据类型的取值范围,那么数据将会插入失败。
• 但是数据类型的约束很单一,为了更好的保证数据的合法性,从业务逻辑角度保证数据的正确性,MySQL中出现了表的约束,目的就是为了尽可能保证数据安全,减少用户的误操作可能性。
• 表的约束有很多,本篇博客主要介绍如下几个:null/not null、default、comment、zerofill、primary key、auto_increment、unique key、foreign key。
2.空属性
• 空属性有两个值,分别是null和not null。
• 数据库默认字段基本都是允许为空的,但在实际开发中我们要尽可能保证字段不为空,因为空值无法参与运算。
比如通过select可以看到null的值为null。如下:
由于空值无法参与运算,因此null值加一后得到的还是null。如下:
如果要让某个字段不允许为空,在创建表的时候就可以给对应字段设置not null属性。比如我们创建一个班级表,表当中包含班级名和该班级所在的教室,如果插入数据时不想让这两个字段为空,就可以在创建表时给这两个字段设置not null属性。如下:
创建表完毕后查看表结构,可以看到这两个字段是不允许为空的。如下:
向表中插入记录时只有这两个字段都不为空时才能插入成功,否则将会插入失败。如下:
3.默认值
• 如果某一个字段会经常性的出现某个值,那么就可以考虑将这个值设置成该字段的默认值。
• 向表中插入数据时如果不给带有默认值的字段赋值,那么就会使用默认值进行插入。
比如创建一个用户表,表当中包含用户的姓名、年龄和性别,将用户的年龄默认设置成0,将用户的性别默认设置成男。如下:
创建表完毕后查看表结构,可以看到默认值已经设置成功了。如下:
向表中插入数据时,如果不指明用户的年龄或性别,那么就会使用对应的默认值,如果指明了就会使用用户指定的值。如下:
同时设置not null和default:
• 一旦给某一字段设置了默认值,那么该字段将不会出现空值,因为就算插入数据时没有指明该字段的值,也会使用该字段的默认值进行填充。
• 而给某一字段设置not null属性的目的是约束该字段不能为空,因此一个字段设置了default属性后,再设置not null属性似乎就没有意义了,但其实是有意义的,not null属性可以防止我们显式的直接插入null,二者是相互补充的。• 给某一字段同时设置了not null和默认值,此时如果插入数据时强行指明该字段为null,则依然会报错,如果不强行指明该字段则该字段为默认值,如果强行指明该字段为某值则该字段为对应值。
创建一个id表,表当中包括姓名和id,将id同时设置default和not null属性。如下:创建表完毕后查看表结构,可以看到id字段是不允许为空的,并且其默认值是1。如下:
此时在向表中插入数据时可以不指明id进行插入,此时会使用id的默认值。如下:
4.列描述
• 列描述是在创建表的时候用来对各个字段进行描述的,列描述会根据表创建语句保存,一般是用来给程序员或DBA了解表的相关信息的,相当于一种注释。
比如创建一个用户表,表当中包含用户名、用户的年龄和用户的性别,在每一个字段后面添加上对应的列描述。如下:
创建表完毕后,通过 show create table 表名 命令可以看到创建表时的相关细节,包括列描述。如下:
5.zerofill
• 数值类型后面的圆括号中的数字,代表的是显示宽度,对应数值类型设置zerofill属性后,如果数据的宽度小于设定的宽度则自动填充0。
比如创建一个表,表当中包含a和b两列整型数据,将它们的显示宽度都设置成5,但是没有设置zerofill属性。如下:
向表中插入一条记录,指明a和b的值均为1,由于我们没有给a和b字段设置zerofill属性,因此查看表中数据时显示出来的都是1,并没有显示宽度的概念。如下:
修改表结构,给a列添加上zerofill属性,由于a列数据的显示宽度为5,因此查看表中数据可以看到a列数据中宽度不足5位的数据都自动在前面填充0了。如下:
需要注意的是,zerofill属性的作用就是让数据以特定的方式进行显示而已,数据底层的储存方式并没有发生变化,通过hex函数可以看到a列中显示的00001在底层实际储存的还是1。如下:
注:如果建表时创建int类型变量时没有圆括号指明int的大小,那么mysql会自动指明,有符号int会自动指明大小为11,无符号int会自动指明大小为10,如下图所示。
一个整数对应32个比特位,如果是无符号的整数,那么其取值范围0到,为42亿多,无符号整数默认10位是因为刚好可以将这42亿多的数值全部显示出来,而有符号整数还多了一个符号位,所以有符号整数默认11位。