前文简绍了null/not null, default, comment, zerofill等约束条件,这篇博客我们将学习剩余的约束,主键(primary key)与唯一键(unique key),外键(foreign key)
1.primary key
主键(PRIMARY KEY) 的核心作用就是:唯一标识表中的每一行数据,像每个人的身份证号一样
三个铁律(记住就行)
-
唯一:不能重复(比如不能有两个学号相同的学生)
-
非空:不能为空(每个记录都必须有一个主键值)
-
唯一且单表一个 :一张表只能有一个主键 (但这个主键可以是由多列组合成的"复合主键",比如
(学号, 课程号)一起当主键)
其他要点
-
常用整数 (配合自增
AUTO_INCREMENT,简单高效),但也可以是字符串、UUID 等 -
自动生成索引:用主键查数据最快
-
被外键引用:其他表可以通过外键指向本表的主键,建立表间关联
一句话总结
主键 = 行数据的唯一身份证,不能空、不能重、一表一个

可以发现只允许插入唯一id值(主键约束:主键对应的字段中不能重复,一旦重复,操作失败)

删除主键

当表创建好以后但是没有主键的时候,可以再次追加主键

复合主键
在创建表的时候,在所有字段之后,使用primary key(主键字段列表)来创建主键,如果有多个字段
作为主键,可以使用复合主键

2.auto_increment
auto_increment
auto_increment:当对应的字段,不给值,会自动的被系统触发,系统会从当前字段中已经有的最大值 +1操作,得到一个新的不同的值。通常和主键搭配使用,作为逻辑主键
自增长的特点:
1.任何一个字段要做自增长,前提是本身是一个索引(key一栏有值)
2.自增长字段必须是整数
3.一张表最多只能有一个自增长

此时我们可以自行插入name,而id会自增长

如果我们直接手动插入一个id,接下来会发生什么呢

在插入后获取上次插入的 AUTO_INCREMENT 的值(批量插入获取的是第一个值)
那我们该怎么知道下一个是什么呢
用下面的函数即可
last_insert_id()

3.unique (key)
唯一键(UNIQUE KEY) 的核心作用:确保字段(或字段组合)的值不重复,类似主键但更灵活
三个核心点
-
值不能重复:比如邮箱、手机号,每个用户只能有一个。
-
允许有空值(NULL) :而且可以有多个空值(不同数据库实现略有差异,常见允许)。
-
一表可以有多个唯一键:比如用户表同时保证邮箱、身份证号都唯一。
与主键的区别(重要)
| 特性 | 主键 | 唯一键 |
|---|---|---|
| 数量 | 只能1个 | 可以有多个 |
| 是否允许空 | 不允许 | 允许(可多个NULL) |
| 用途 | 唯一标识一行 | 保证业务字段不重复 |
一句话总结
唯一键 = 禁止重复但允许空值的约束,一表多个,常用于邮箱、手机号等需要唯一但不做主键的字段


4.foreign key
外键用于定义主表和从表之间的关系:外键约束主要定义在从表上,主表则必须是有主键约束或unique约束。当定义外键后,要求外键列数据必须在主表的主键列存在或为null
foreign key (字段名) references 主表(列)

1.先创建主键表

2.再创建从表

3.正常插入数据

4.插入一个班级号为104的学生,因为没有这个班级,所以插入不成功

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