主键约束确保每行唯一且非空,外键约束强制子表字段值必须存在于父表主键中;建表时用PRIMARY KEY和FOREIGN KEY定义,已有表添加需先清理重复与NULL值,InnoDB引擎是外键前提。

在MySQL中,主键唯一性与外键约束是保障数据完整性的核心机制,直接决定业务数据能否准确反映现实关系——比如订单必须归属真实存在的用户,学生ID不能重复且不能为空。
主键约束:强制实体唯一且非空
第一步:建表时直接定义主键字段,用 【PRIMARY KEY】 明确标识该字段为唯一标识列。
CREATE TABLE users (id INT PRIMARY KEY, name VARCHAR(50));
这一步让MySQL自动为id列添加NOT NULL + UNIQUE双重限制,后续插入NULL或重复id会直接报错。
第二步:若需多字段联合唯一标识(如“班级+学号”组合不可重复),必须用括号语法声明联合主键。
CREATE TABLE students (class_id INT, stu_no INT, name VARCHAR(50), PRIMARY KEY (class_id, stu_no));
注意:联合主键中任一字段允许重复,但组合值整体必须唯一;一旦定义,无法通过ALTER TABLE拆分单个字段为主键。
第三步:已有表无主键时,用ALTER TABLE添加主键前,必须确保目标列无NULL值且无重复数据,否则命令执行失败。
外键约束:绑定父子表,强制参照存在
方法一:建表时同步定义外键,明确指向父表主键。
CREATE TABLE orders (order_id INT PRIMARY KEY, user_id INT, FOREIGN KEY (user_id) REFERENCES users(id));
这一步让orders表的user_id只能填users表中真实存在的id值,插入不存在的user_id会触发ERROR 1452。
方法二:先建子表,再用ALTER TABLE添加外键约束,但要求两张表引擎均为InnoDB。
【MyISAM引擎不支持外键】,若误用会导致ALTER语句静默忽略外键定义,表面成功实则无效。
方法三:定义外键时指定ON DELETE/ON UPDATE行为,避免级联操作失控。
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE ON UPDATE RESTRICT;
ON DELETE CASCADE表示删users某行时自动删其所有orders记录;ON UPDATE RESTRICT则禁止修改users.id——这是防止关联断裂的安全默认。
破坏完整性时的真实报错场景
当尝试向orders插入user_id = 999,而users表中最大id为100时,MySQL返回:ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails。
这个错误不是程序逻辑问题,而是数据库层硬性拦截,说明外键正在起作用。
删除users表中被orders引用的记录时,若未设ON DELETE规则,默认行为是RESTRICT,同样触发ERROR 1451。
主键冲突更直观:INSERT INTO users VALUES (1, 'Alice'); 再执行一次相同语句,报错ERROR 1062:Duplicate entry '1' for key 'PRIMARY'。

















