MySQL表的约束(二)

前文简绍了null/not null, default, comment, zerofill等约束条件,这篇博客我们将学习剩余的约束,主键(primary key)与唯一键(unique key),外键(foreign key)

1.primary key

主键(PRIMARY KEY) 的核心作用就是:唯一标识表中的每一行数据,像每个人的身份证号一样

三个铁律(记住就行)

  1. 唯一:不能重复(比如不能有两个学号相同的学生)

  2. 非空:不能为空(每个记录都必须有一个主键值)

  3. 唯一且单表一个 :一张表只能有一个主键 (但这个主键可以是由多列组合成的"复合主键",比如 (学号, 课程号) 一起当主键)

其他要点

  • 常用整数 (配合自增 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) 的核心作用:确保字段(或字段组合)的值不重复,类似主键但更灵活

三个核心点

  1. 值不能重复:比如邮箱、手机号,每个用户只能有一个。

  2. 允许有空值(NULL) :而且可以有多个空值(不同数据库实现略有差异,常见允许)。

  3. 一表可以有多个唯一键:比如用户表同时保证邮箱、身份证号都唯一。

与主键的区别(重要)

特性 主键 唯一键
数量 只能1个 可以有多个
是否允许空 不允许 允许(可多个NULL)
用途 唯一标识一行 保证业务字段不重复

一句话总结

唯一键 = 禁止重复但允许空值的约束,一表多个,常用于邮箱、手机号等需要唯一但不做主键的字段

4.foreign key

外键用于定义主表和从表之间的关系:外键约束主要定义在从表上,主表则必须是有主键约束或unique约束。当定义外键后,要求外键列数据必须在主表的主键列存在或为null

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

1.先创建主键表

2.再创建从表

3.正常插入数据

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

5.插入班级id为null,比如来了一个学生,目前还没有分配班级

首先我们承认,这个世界是数据很多都是相关性的。

理论上,上面的例子,我们不创建外键约束,就正常建立学生表,以及班级表,该有的字段我们都有。

此时,在实际使用的时候,可能会出现什么问题?

有没有可能插入的学生信息中有具体的班级,但是该班级却没有在班级表中?

比如比特只开了比特100班,比特101班,但是在上课的学生里面竟然有比特102班的学生(这个班目前并

不存在),这很明显是有问题的。

因为此时两张表在业务上是有相关性的,但是在业务上没有建立约束关系,那么就可能出现问题。

解决方案就是通过外键完成的。建立外键的本质其实就是把相关性交给mysql去审核了,提前告诉mysql

表之间的约束关系,那么当用户插入不符合业务逻辑的数据的时候,mysql不允许你插入

这就是关于MySQL的所有基本约束啦,我们下篇博客不见不散哦~~

相关推荐
程序员黑豆6 小时前
Java类型推断完全指南:从var到菱形运算符,掌握使用限制与最佳实践
java·前端·ai编程
风流 少年7 小时前
Spring AI 2.0:Memory
java·后端·spring
码匠许师傅7 小时前
【C++ 面试真题】聊聊 C++ 的移动语义与右值引用
java·c++·面试
2603_965148118 小时前
如何解析JSON数据?API返回的商品信息处理教程
开发语言·数据库·python·自动化·json·api
ltl8 小时前
RocksDB 经典故障排查:L0、compaction 与 write stall
数据库
小席是个热心肠8 小时前
AI相关的自我学习
java·人工智能·学习
xfhuangfu9 小时前
Oracle中建立到CDB和PDB的连接
数据库·oracle·rpc
小小龙学IT9 小时前
DuckDB 深度实战:用 C++ 在进程内跑一个「分析型数据库」
数据库·c++
NineData9 小时前
DTCC 2026 预告|NineData CEO& 创始人叶正盛:面向 AI Agent 的数据库 DevOps 与数据复制实践
数据库·人工智能·数据库开发·devops·ninedata·数据库技术·dtcc
J_bean10 小时前
MySQL 事务是否必须手动开启?
数据库·mysql·数据库事务·自动提交·手动提交