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的所有基本约束啦,我们下篇博客不见不散哦~~

相关推荐
梁萌2 小时前
MySQL 中 utf8mb4_bin 与 utf8mb4_general_ci 区别
数据库·mysql
2301_773553622 小时前
如何在登录界面添加自定义背景图片_Login CSS覆盖修改
jvm·数据库·python
cyber_两只龙宝2 小时前
【Oracle】Oracle之SQL的集合运算符
linux·运维·数据库·sql·云原生·oracle
m0_493934532 小时前
JavaScript中模块化在游戏引擎开发中的资源调度作用
jvm·数据库·python
云烟成雨TD2 小时前
Spring AI Alibaba 1.x 系列【34】Human-in-the-Loop(人在回路)执行流程
java·人工智能·spring
m0_617881422 小时前
如何优雅处理SQL存储过程异常_使用TRY-CATCH块机制
jvm·数据库·python
步辞2 小时前
如何用SQL实现分组内前N个百分比筛选_窗口函数应用
jvm·数据库·python
m0_684501982 小时前
PySpark中高效展开嵌套数组:避免笛卡尔爆炸的正确实践
jvm·数据库·python
zdzx auvu2 小时前
MySQL 函数
数据库·mysql