
目录
一、表的约束
MySQL数据库是有唯一性约束的,真正对表的字段进行约束的是字段类型,比如我们字段类型规定的取值范围是多少,如果我们插入的数据超出了这个范围,MySQL是不会让我们插入的。这里和高级程序语言不一样,我们以前在使用C/C++的时候,如果定义的整型超出了范围,它会自动帮我们截断,但是MySQL没有截断这一说,只要超出了范围,就是不允许插入,这样可以保证数据是一定正确的。
可以说,约束的本质,就是通过技术手段,倒逼程序员输入正确的字段从而维护数据库的完整性。
但是字段类型的约束还是比较单一的,还需要一些额外的约束,从而更好地保证数据的合法性,从业务逻辑保证数据的正确性。比如说我们要插入一个email邮箱号字段,要保证该字段插入的数据是唯一的,就需要使用到数据库的约束了。数据库表的约束有很多,这篇文章主要介绍以下几种约束:空属性、默认值、列描述、zerofill、主键、自增长、唯一键、外键。
二、空属性
数据库的大部分字段在定义的时候默认都是空的,但在实际开发中,尽可能保证字段不为空,因为如果数据为空的话就没办法参与计算了。
这里我们创建一个班级表来举个例子理解一下。
创建一个班级表,包含班级名和班级所在的教室。
站在正常的业务逻辑中:
- 如果班级没有名字,你不知道你在哪个班级
- 如果教室名字可以为空,就不知道在哪上课
这两个字段我们就得设置成not null,所以我们在设计数据库表的时候,一定要在表中进行限制,满足上面条件的数据就不能插入到表中。这就是“约束”。

这里我们可以看到,缺少班级教室的字段无法插入,这样我们就叫做是空属性的约束。
三、默认值
某些数据可能会经常出现某个具体的值,我们可以在一开始建表的时候就给这类数据一个默认值,如果用户填入了该字段的值就使用用户输入的,如果没有则使用默认值。

这里可以看到,我们并没有为zhangsan指定sex字段,但是我们在定义时便使用了default。所以这里使用的是默认值。
注意:只有设置了default的列,才可以在插入值的时候,对列进行省略
四、列描述
在定义字段时我们可以使用comment来描述这一列,列描述没有实际含义,它的意义是说明,专门用来描述字段,会根据表的创建语句保存,用来给别人快速了解该字段的含义是什么。


五、zerofill
从字面意思来看,就是补零的意思,那么是哪里需要补零呢?

如果我们建立一个两个整型a和b的表,我们会发现int(11)是什么东西,好像没有zerofill存在。
但是对列添加了zerofill属性后,显示的结果就有所不同了。修改tt3表的属性:

这次可以看到a的值由原来的1变成00001,这就是zerofill属性的作用,如果宽度小于设定的宽度(这里设置的是5),自动填充0。要注意的是,这只是最后显示的结果,在MySQL中实际存储的还是1。为什么是这样呢?我们可以用hex函数来证明。

六、主键
1.primary key
主键是用来约束该字段里数据的唯一性的,比如说当前有一张表,表中的id字段被设置为主键,那么在后续向id这一列插入数据时,不可以插入列中已经存在的数据,也就是说该列数据不能出现重复。并且被设置为主键的字段默认不能为空。一张表最多只能有一个主键。

我们这里先创建一个主键,再往里面插入数据:

可以看到因为主键的存在,我们无法插入已拥有的数据。
如果我们想要删除主键,可以使用下面的语句,只需要提出想要删除主键的表名即可,不需要指定到哪一列,因为一张表中只允许有一个主键:
alter table 表名 drop primary key;
如果我们又想要给表中的某一列添加主键,可以使用下面的语句:
alter table 表名 add primary key(字段列表)
2.复合主键
如果我们需要有多个字段作为主键,也可以使用复合主键。比如假设我们有这样的学生抢课场景,同一个学生可以选择多门课程,多个学生可以选择同一个课程,但是一个学生不能重复选择同一个课程,此时如果我们就可以使用复合主键了。复合主键在创建表的时候,在所有字段定义完之后,使用primary key(主键字段列表)来创建主键。

如图,这样我们就实现了复合主键。
七、自增长
当字段被设置为自增长时,如果我们在向表插入数据时没有给该字段数据,就会自动触发自增长,系统会将当前字段中已经存在的数据最大值加一,再新插入到该字段中。
auto_increment:当对应的字段,不给值,会自动的被系统触发,系统会从当前字段中已经有的最大值
+1操作,得到一个新的不同的值。通常和主键搭配使用,作为逻辑主键。
自增长有以下几个特点:
- 任何一个字段要做自增长,前提是本身就是一个索引。
- 自增长字段必须被设置为主键。
- 自增长字段的数据必须是整数。
- 一张表最多只有一个自增长。

这里我们可以看到id会自增长,如果我们这里插入id为1000的呢,那么id下一个自增就从1001开始,我们也可以看一下注释。
八、唯一键
一张表中有往往有很多字段需要唯一性,数据不能重复,但是一张表中只能有一个主键:
唯一键就可以解决表中有多个字段需要唯一性约束的问题。
唯一键的本质和主键差不多,唯一键允许为空,而且可以多个为空,空字段不做唯一性比较。关于唯一键和主键的区别:
我们可以简单理解成,主键更多的是标识唯一性的。而唯一键更多的是保证在业务上,不要和别的信息出现重复。乍一听好像没啥区别,我们举一个例子来看看。

这里可以看到,唯一键不能重复但是可以为空。
九、外键
外键是用来定义主表和从表之间关系的属性,它一共有两个功能,第一个是关联两张表,第二个是对表中的数据进行约束。举个例子,假设我们要设计一张学生表和班级表,每个学生都对应自己的班级,如果我们把班级名称和学生都放在同一张表,就会出现数据冗余。所以将其分开为学生表和班级表,学生表中有班级编号字段,通过这个班级编号就可以在班级表中找到对应的班级,这样就将两张表关联起来了,其中班级编号就是关联两张表的外键。

foreign key (字段名) references 主表(列)

我们可以看到,MUL代表的就是外键。当插入数据不存在时,插入就会失败。
如何理解外键约束
首先我们承认,这个世界是数据很多都是相关性的。
理论上,上面的例子,我们不创建外键约束,就正常建立学生表,以及班级表,该有的字段我们都有。
此时,在实际使用的时候,可能会出现什么问题?
有没有可能插入的学生信息中有具体的班级,但是该班级却没有在班级表中?
比如只有10班,11班,但是在上课的学生里面竟然有12班的学生(这个班目前并
不存在),这很明显是有问题的。因为此时两张表在业务上是有相关性的,但是在业务上没有建立约束关系,那么就可能出现问题。
解决方案就是通过外键完成的。建立外键的本质其实就是把相关性交给mysql去审核了,提前告诉mysql表之间的约束关系,那么当用户插入不符合业务逻辑的数据的时候,mysql不允许你插入。

1万+

被折叠的 条评论
为什么被折叠?



