数据库主键和外键有哪些根本不同之处?
- 内容介绍
- 文章标签
- 相关推荐
一、前言:为何主键与外键总让人摸不着头脑?
在实际项目中。开发者常因以下痛点而陷入困惑:
- 不清楚哪个字段应该设为主键,导致数据重复或查询慢。
- 外键关系设置错误。引发“引用完整性”异常,业务数据出现孤儿记录。
- 误以为主键和外键可以互换使用,结果导致更新/删除操作被意外阻断。
下面通过结构化的对比。彻底拆解这两大概念的根本区别,帮助你在设计阶段“一次到位”。话说回来,
二、主键到底是干什么的?
1. 定义
主键是用于唯一标识表中每一条记录的一个或多个字段。每个表只能有一个主键,但可以由复合列组成。
2. 主要特性
- 唯一性:所有记录的主键值必须唯一,不能重复。
-
非空性:主键列不能包含
NULL。 - 不可变性:一旦记录创建后主键值原则上不应被修改。
- 默认索引:大多数数据库会自动为主键创建唯一索引,提高查询效率。说起来,
3. 主要作用
- 唯一标识每条数据。确保数据完整性,
- 作为其他表外键的引用目标,实现跨表关联。
- 基于该列的检索速度。
外键是位于子表中的一个或多个字段。用来引用另一张表的主键,从而在两张表之间关系。
- 引用完整性:外键列的取值必须在父表对应的主键列中存在否则插入/更新会失败。
-
可为空:除非显式加 NOT NULL 限制,外键字段可以为
NULL - Cascade 操作:可以配置在父表记录被删除或更新时同步在子表执行级联删除/更新、限制或置空等行为。
- 非唯一索引:外键本身不保证唯一,只是保证值来源合法。
- 在不同表之间,实现“一对多”“多对多”等关系模型。
- 防止出现“孤儿记录”,维护数据的一致性与完整性。 >
- 配合级联操作,可简化业务层代码中的同步删除/更新逻辑。
四、根本区别一览表
| 主键 | 外键 | |
|---|---|---|
| 唯一标识 vs 关系 | ||
| - 必须唯一 - 不允许 NULL - 通常自动建唯一索引 | - 值必须出现在父表 PK 中 - 可为 NULL - 不强制唯一 | |
| 每张表只能有一个 | ||
| - 自动创建唯一索引。提高检索速度 | - 可手动创建普通索引提高联接性能,但不是强制 | |
| - 被其他表作为外键引用 | - 依赖父表的 PK;可配置 ON DELETE/ON UPDATE 行为 | |
| - 表的身份标识 - 分区、分片等技术的依据 | ||
| 数据完整性层面 | 保证行级唯一 性,防止 重复 插入。 | 确保引用合法,防止 “孤儿 ” 记录。 |
| 性能考量 | 主 键 索引 是 B‑Tree / 聚簇 索引 的 基础,检索极快。 | 若无额外索引,基于 FK 的 JOIN 可能导致全 表 扫描。建议针对 FK 列单独建普通索引。 |
五、常见痛点 & 实战方法
六、要点
- 🔷P = Primary = 唯一 + 非空 + 默认建唯一索引 → 标识行.
- 🔷K = Key for Relation = Foreign → 引用父 PK。保证引用完整性,可配级联.
- 🔹P 用来定位单条记录;K 用来连通多条记录.
- 🔹P 必须唯一且不可改;K 可为空,可改,但受父表约束.
- 🔸P 自动带索引;K 如需高效 JOIN,请自行加普通索引.
- 🔸P 是“一”。K 是“一对多/多对多”的桥梁.
- 🟠P 出现错误→ 数据重复/无法插入;K 出现错误→ 引用不存在/级联冲突.
- ✅Cascade、Restrict、Set Null 三种行为决定删除/更新时子表如何响应.
- ✅Avoid using mutable business fields as PK;按理说,always prefer surrogate keys for stability.
掌握以上主要区别。你就能在数据库设计阶段避免常见坑,让程序更稳、更快、更易维护。
一、前言:为何主键与外键总让人摸不着头脑?
在实际项目中。开发者常因以下痛点而陷入困惑:
- 不清楚哪个字段应该设为主键,导致数据重复或查询慢。
- 外键关系设置错误。引发“引用完整性”异常,业务数据出现孤儿记录。
- 误以为主键和外键可以互换使用,结果导致更新/删除操作被意外阻断。
下面通过结构化的对比。彻底拆解这两大概念的根本区别,帮助你在设计阶段“一次到位”。话说回来,
二、主键到底是干什么的?
1. 定义
主键是用于唯一标识表中每一条记录的一个或多个字段。每个表只能有一个主键,但可以由复合列组成。
2. 主要特性
- 唯一性:所有记录的主键值必须唯一,不能重复。
-
非空性:主键列不能包含
NULL。 - 不可变性:一旦记录创建后主键值原则上不应被修改。
- 默认索引:大多数数据库会自动为主键创建唯一索引,提高查询效率。说起来,
3. 主要作用
- 唯一标识每条数据。确保数据完整性,
- 作为其他表外键的引用目标,实现跨表关联。
- 基于该列的检索速度。
外键是位于子表中的一个或多个字段。用来引用另一张表的主键,从而在两张表之间关系。
- 引用完整性:外键列的取值必须在父表对应的主键列中存在否则插入/更新会失败。
-
可为空:除非显式加 NOT NULL 限制,外键字段可以为
NULL - Cascade 操作:可以配置在父表记录被删除或更新时同步在子表执行级联删除/更新、限制或置空等行为。
- 非唯一索引:外键本身不保证唯一,只是保证值来源合法。
- 在不同表之间,实现“一对多”“多对多”等关系模型。
- 防止出现“孤儿记录”,维护数据的一致性与完整性。 >
- 配合级联操作,可简化业务层代码中的同步删除/更新逻辑。
四、根本区别一览表
| 主键 | 外键 | |
|---|---|---|
| 唯一标识 vs 关系 | ||
| - 必须唯一 - 不允许 NULL - 通常自动建唯一索引 | - 值必须出现在父表 PK 中 - 可为 NULL - 不强制唯一 | |
| 每张表只能有一个 | ||
| - 自动创建唯一索引。提高检索速度 | - 可手动创建普通索引提高联接性能,但不是强制 | |
| - 被其他表作为外键引用 | - 依赖父表的 PK;可配置 ON DELETE/ON UPDATE 行为 | |
| - 表的身份标识 - 分区、分片等技术的依据 | ||
| 数据完整性层面 | 保证行级唯一 性,防止 重复 插入。 | 确保引用合法,防止 “孤儿 ” 记录。 |
| 性能考量 | 主 键 索引 是 B‑Tree / 聚簇 索引 的 基础,检索极快。 | 若无额外索引,基于 FK 的 JOIN 可能导致全 表 扫描。建议针对 FK 列单独建普通索引。 |
五、常见痛点 & 实战方法
六、要点
- 🔷P = Primary = 唯一 + 非空 + 默认建唯一索引 → 标识行.
- 🔷K = Key for Relation = Foreign → 引用父 PK。保证引用完整性,可配级联.
- 🔹P 用来定位单条记录;K 用来连通多条记录.
- 🔹P 必须唯一且不可改;K 可为空,可改,但受父表约束.
- 🔸P 自动带索引;K 如需高效 JOIN,请自行加普通索引.
- 🔸P 是“一”。K 是“一对多/多对多”的桥梁.
- 🟠P 出现错误→ 数据重复/无法插入;K 出现错误→ 引用不存在/级联冲突.
- ✅Cascade、Restrict、Set Null 三种行为决定删除/更新时子表如何响应.
- ✅Avoid using mutable business fields as PK;按理说,always prefer surrogate keys for stability.
掌握以上主要区别。你就能在数据库设计阶段避免常见坑,让程序更稳、更快、更易维护。

