一、本质区别
| 特性 | 主键 | 外键 |
|---|---|---|
| 核心作用 | 唯一标识本表记录 | 关联其他表的主键 |
| 唯一性 | 值唯一且不可重复 | 值可重复 |
| 空值 | 不允许为空 | 允许为空 |
| 数量限制 | 每张表仅能有一个主键 | 每张表可有多个外键 |
| 数据约束 | 强制非空 + 唯一性 | 强制引用其他表的主键值 |
通俗比喻:主键相当于学生的学号,外键相当于成绩单上的学号。
二、实际应用场景
主键适用场景
- 标识核心实体:如用户表中的 user_id。
- 加速查询:自动创建聚集索引,提升检索效率。
外键适用场景
- 建立表间关系:如订单表关联商品表。
- 维护数据一致性:
-- 订单表外键关联用户表
ALTER TABLE orders ADD FOREIGN KEY (user_id) REFERENCES users(user_id);
三、关键设计注意事项
- 主键选择:优先用自增整数(AUTO_INCREMENT),避免业务字段。
- 外键性能:高并发场景慎用外键,频繁校验可能降低写入性能。替代方案:应用层校验(如 Redis 分布式锁)。
- 级联操作:外键可配置级联规则(CASCADE/SET NULL),但误用可能导致意外数据丢失。
四、最佳实践总结
- 主键必建:确保每条记录有唯一标识,无主键的表禁止上线。
- 外键取舍:传统系统推荐;高并发系统改用应用层校验(如阿里 Java 开发规范禁用外键)。
- 索引优化:外键字段必须建索引,避免关联查询全表扫描。
结论:主键管身份,外键管关系,二者配合保障数据库完整性。


