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

相关推荐
我滴老baby16 小时前
工业时序数据实战:基于 DolphinDB 流计算引擎的实现与调优
数据库
wuminyu16 小时前
Java锁机制之Java对象重量级锁源码剖析
java·linux·c语言·jvm·c++
艾利克斯冰16 小时前
Java设计模式-创建型设计模式
java
心之伊始16 小时前
MySQL EXPLAIN 执行计划实战:从 type、Extra 到慢 SQL 定位与优化
java·架构·源码分析·csdn
Java_2017_csdn16 小时前
ComplexKeysShardingAlgorithm 小结
java·大数据·算法
睡不醒男孩03082316 小时前
TiDB数据库调研
数据库·tidb
海梨花16 小时前
快手面试高频算法题
java·算法·面试
云烟成雨TD17 小时前
Spring AI 1.x 系列【37】RAG 知识库平台案例:知识库管理
java·人工智能·spring
珠***格17 小时前
实操落地|防逆流装置的安装规范、调试标准与故障处置
网络·数据库·人工智能·分布式·能源·边缘计算
KANGBboy17 小时前
java知识四(面向对象编程)
android·java·开发语言