主键和外键是数据库规范化的核心基础:主键强制唯一非空以标识每行,外键建立表间引用并保障完整性;二者协同消除冗余、防止孤立数据、优化join查询,并支撑三范式设计。

数据库规范化要求每张表必须有明确的唯一标识和清晰的表间关联路径,主键和外键正是实现这一目标不可替代的结构基础。
主键:为每行数据赋予不可替代的身份
第一步:在建表语句中用 PRIMARY KEY 显式声明主键字段,例如 user_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY。
第二步:确保该字段值全局唯一且绝不为空——数据库会自动拒绝插入 NULL 或重复值的记录,这是强制性的完整性校验。
第三步:避免使用业务字段(如身份证号、手机号)作主键,因为业务变更会导致主键修改,引发级联风险;【自增整数或UUID才是安全选择】。
这一步操作起来很简单,直接把 PRIMARY KEY 加到建表语句里就行。但若漏掉 NOT NULL,MySQL 8.0+ 会报错;而低版本可能静默允许 NULL,导致后续查询逻辑混乱。
外键:在表与表之间钉入可信的引用锚点
方法一:建表时直接定义外键约束
在订单表中声明 FOREIGN KEY (user_id) REFERENCES users(user_id) ON DELETE CASCADE,让数据库自动拦截非法 user_id 插入,并在用户删除时同步清理其订单。
方法二:对已有表添加外键
先确认被引用表(如 users)已存在主键索引,再执行 ALTER TABLE orders ADD CONSTRAINT fk_user_id FOREIGN KEY (user_id) REFERENCES users(user_id);。若 users 表无主键或 user_id 列未建索引,此命令将失败。
【必须提前在被引用列上建立索引,否则 MySQL 拒绝创建外键】。这是硬性前提,不是可选项。
主键与外键协同实现规范化落地
① 消除冗余:用户姓名只存于 users 表,orders 表仅保留 user_id 外键,避免多处更新导致不一致。
② 防止孤立数据:当外键启用 ON DELETE RESTRICT(默认),试图删除仍有订单的用户会直接报错,阻断逻辑断裂。
③ 支持 JOIN 高效关联:数据库优化器依赖主键和外键的统计信息生成最优执行计划,缺少任一都将退化为全表扫描。
④ 构成范式基础:第一范式(1NF)靠主键保证原子性与行唯一;第二范式(2NF)要求非主属性完全依赖主键——此时若主键是复合键,外键必须完整引用全部组成部分,否则违反规范。











