🔑 本质区别
| 特性 | 主键 (Primary Key) | 外键 (Foreign Key) |
|---|---|---|
| 核心作用 | 唯一标识本表记录(如身份证号) | 关联其他表的主键(如订单关联用户 ID) |
| 唯一性 | ✅ 值唯一且不可重复 | ❌ 值可重复(可关联同个主键) |
| 空值 | ❌ 不允许为空 | ✅ 允许为空(如'未绑定用户'订单) |
| 数量限制 | 每张表仅能有一个 | 每张表可有多个 |
| 数据约束 | 强制非空 + 唯一性 | 强制引用其他表的主键值(保证一致性) |
💡 通俗比喻:主键像学生的学号,用于唯一标识一个人;外键像成绩单上的学号,用于证明成绩属于谁。
⚙️ 实际应用场景
主键适用场景
- 标识核心实体:例如用户表中的
user_id,必须不可重复。 - 加速查询:自动创建聚集索引,大幅提升检索效率。
外键适用场景
- 建立表间关系:电商系统中,订单表通过
product_id外键关联商品表。 - 维护数据一致性:当配置级联删除时,用户被删除可自动清理其所有订单。
-- 订单表外键关联用户表
ALTER TABLE orders ADD FOREIGN KEY (user_id) REFERENCES users(user_id);
⚠️ 关键设计注意事项
- 主键选择:优先用自增整数(如
AUTO_INCREMENT),避免使用业务字段(如手机号可能变更)。 - 外键性能:高并发场景下慎用外键。频繁校验可能降低写入性能,建议改用应用层校验(如 Redis 分布式锁)。
- 级联操作:外键可配置级联规则(如
CASCADE/SET NULL),但误用可能导致意外数据丢失,需格外谨慎。
💎 最佳实践总结
- 主键必建:确保每条记录有唯一标识,无主键的表禁止上线。
- 外键取舍:传统系统推荐使用以简化一致性维护;高并发系统建议应用层校验(参考阿里 Java 开发规范)。
- 索引优化:外键字段必须建索引,避免关联查询全表扫描。
📌 一句话结论:主键管身份(唯一性),外键管关系(一致性),二者配合保障数据库的完整性与关联性。


