目录
MySQL表的约束
字段的实际约束由数据类型决定,但数据类型本身的限制较为单一。为了确保数据的合法性和业务逻辑的正确性,我们需要引入额外的约束机制。例如,对于email字段,通常会要求其具有唯一性。
常见的表约束包括以下几种:
- null/not null
- default
- comment
- zerofill
- primary key
- auto_increment
- unique key
- foreign key
1.空属性
两个可选值:null
(默认值)和not null
(非空)。
在数据库设计中,字段默认允许为空值。但在实际开发中,建议尽可能将字段设置为非空,因为空值无法参与数据运算。
如图所示,null+1的结果仍然是null,这进一步验证了空值无法参与数值运算的特性。
示例:
创建一个班级表,包含班级名和班级所在的教室。
站在正常的业务逻辑中:
如果班级没有名字,你不知道你在哪个班级
如果教室名字可以为空,就不知道在哪上课
所以我们在设计数据库表的时候,一定要在表中进行限制,满足上面条件的数据就不能插入到表中。这 就是“约束”。
如果我们需要某一列不为空,可以在其后加上not null,如下图创建表后的表结构可以看出两列class_name和class_room的null属性都是NO(也就是不为空的意思)
如下图我们可以发现没有给class_room赋值,默认为空,由于我们加了not null,所以mysql产生报错
2.默认值
什么是默认值?
默认值是指对于某种数据,当某个特定值频繁出现时,可以预先设定该值作为默认选项。在实际使用时,用户可以根据需要决定是否采用该默认值。
示例:
如图所示,我们在sex和age两字段后添加了default(默认值)设置。对应地,表结构中的Default列显示了"男"和"0"这两个默认值。这意味着当插入数据时,如果不对这些字段赋值,系统将自动采用这些预设的默认值。
注意:只有设置了default的列,才可以在插入值的时候,对列进行省略
3.列描述
字段描述:comment
,用于记录字段的说明信息,本身不具备实际数据意义。该描述会随表创建语句保存,主要供开发人员或数据库管理员查阅参考。(相当于注释的作用)
示例:
创建表:
通过desc查看不到注释信息:
通过show可以看到:
4.zerofill
首先我们先创建一个不添加zerofill属性的表:
在向其中插入数据:
我们由上表中可以看出a,b是正常的被插入1,2。
然后我们修改a的属性,向其中添加zerofill:
最后查看其内容有什么变化:
这次可以看到a的值由原来的1变成0000000001这就是zerofill属性的作用,如果宽度小于设定的宽度(这里设置的是10),自动填充0。
要注意的是,这只是最后显示的结果,在MySQL中实际存储的还是1。:(在这里我们使用hex函数来证明)
可以看出数据库内部存储的还是1,0000000001只是设置了zerofill属性后的一种格式化输出而已
5.主键
那什么是主键呢?
主键(primary key)用于唯一标识表中的数据记录,具有以下特性:
- 值必须唯一且不可为空
- 每张表最多只能设置一个主键
- 通常采用整数类型作为主键列
示例:
(1)创建表的时候直接在字段上指定主键(此处我们用学号来作为案例)
由上图可以看出id列Key上面多出了个PRI这就是被赋予了主键的属性。
(2)主键约束:主键对应的字段中不能重复,一旦重复,操作失败。(我们案例的主键字段是id)
由上图我们可以看出我们刚开始主键id插入了一个1,后面再插入1时会发现插入失败这就是主键的约束。
(3)当表创建好以后但是没有主键的时候,可以再次追加主键
alter table 表名 add primary key(字段列表)
(4)删除主键
alter table 表名 drop primary key;
由上图我们可以看到id的主键属性被删除了。
(5)复合主键
在创建表的时候,在所有字段之后,使用primary key(主键字段列表)来创建主键,如果有多个字段 作为主键,可以使用复合主键。
由上图可知此时id和course为复合主键。
由上图可知只有复合主键都重复时,插入才会失败(主键冲突),复合主键中的其中一个没有重复,则插入还是成功的。
6.自增长
什么是自增长呢?
auto_increment
:若该字段未赋值,系统会自动为其生成一个值。具体规则是取当前字段最大值加1,确保新值的唯一性。该属性通常与主键配合使用,作为逻辑主键。
自增长字段的特性:
必须满足以下条件才能设置为自增长:
- 该字段本身是索引(key栏有值)
- 字段类型为整数
每张表最多只能拥有一个自增长字段
示例:
设置完自增长后我们会发现在Extra处有auto_increment,这就是添加了自增长的属性。
首先我们插入两个值:
由上图我们会发现我们并没有给id赋值,他自动添加为了1和2。
那么此时我们来查看一下show create....
这是我们会AUTO_INCREMENT=3的字样,此时我们就会明白下一个id插入的值为3(我们没有赋值的情况下),很好的验证了开头自增长的定义。
在插入后获取上次插入的 AUTO_INCREMENT 的值(批量插入获取的是第一个值)
7.唯一键
在一张表中,通常会有多个字段需要保证数据的唯一性。然而,每张表只能设置一个主键。这时,唯一键(UNIQUE KEY)就能很好地解决多个字段需要唯一性约束的问题。
唯一键的功能与主键类似,但它允许字段值为空。需要注意的是,唯一键可以包含多个允许为空的字段,且系统不会对空值进行唯一性比较。
关于唯一键和主键的区别: 我们可以简单理解成,主键更多的是标识唯一性的。而唯一键更多的是保证在业务上,不要和别的信息出现重复。
示例:
(1)首先创建一个包含唯一键属性的表:
由上表我们可以看出学号也就是id后面的Key包含UNI的属性也就是唯一键的属性。
(2)插入数据:
由上图我们可以看出第二次插入失败,是因为唯一键的约束:不能重复,并且唯一键可以为空
8.外键
外键用于建立主表和从表之间的关联关系:外键约束通常设置在从表上,而主表必须具有主键约束或唯一约束。一旦定义外键,要求从表的外键列数据必须在主表的主键列中存在对应值,或者为null值。
语法:
foreign key (字段名) references 主表(列)
示例:
对上面的示意图进行设计:
(1)先创建主键表
(2)再创建从表(此时并且和主表建立关系)
(3)正常插入数据
(4)插入一个班级号为30的学生,因为没有这个班级,所以插入不成功
(5)插入班级id为null,比如来了一个学生,目前还没有分配班级
(6)当我们要删除班级时,如果这个班级有学生的话,则删除失败,这就是外键约束。
建立外键的本质其实就是把相关性交给mysql去审核了,提前告诉mysql 表之间的约束关系,那么当用户插入不符合业务逻辑的数据的时候,mysql不允许你插入。