MySQL表的约束

发布于:2025-08-30 ⋅ 阅读:(17) ⋅ 点赞:(0)

目录

MySQL表的约束

1.空属性

2.默认值

3.列描述

4.zerofill

5.主键

6.自增长

7.唯一键

8.外键


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,确保新值的唯一性。该属性通常与主键配合使用,作为逻辑主键。

自增长字段的特性:

  1. 必须满足以下条件才能设置为自增长:

    • 该字段本身是索引(key栏有值)
    • 字段类型为整数
  2. 每张表最多只能拥有一个自增长字段

示例:

设置完自增长后我们会发现在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不允许你插入。


网站公告

今日签到

点亮在社区的每一天
去签到