mysql的外键约束用于维护两个表之间的关联关系,当对主表的主键或唯一键进行更新、删除操作时,从表的外键字段会根据设置的约束等级执行对应的处理逻辑,以此保证关联数据的完整性和一致性。

mysql支持的5种外键约束等级
mysql的外键约束等级分为针对删除操作和更新操作的两类规则,组合起来共5种常用的约束等级,具体如下:
| 约束等级名称 | 删除主表记录时的行为 | 更新主表关联键时的行为 |
|---|---|---|
| CASCADE | 自动删除从表中关联的记录 | 自动更新从表中关联的外键值 |
| SET NULL | 将从表关联记录的外键值设为NULL | 将从表关联记录的外键值设为NULL |
| RESTRICT | 拒绝删除主表记录,返回错误 | 拒绝更新主表关联键,返回错误 |
| NO ACTION | 等价于RESTRICT,拒绝操作返回错误 | 等价于RESTRICT,拒绝操作返回错误 |
| SET DEFAULT | 将从表外键值设为预设的默认值 | 将从表外键值设为预设的默认值 |
各约束等级详细说明
1. CASCADE(级联操作)
当主表的关联记录被删除或更新时,从表中所有关联的外键记录会同步执行删除或更新操作。这种方式适合主从表数据强关联的场景,比如订单表和订单明细表,删除订单时同步删除对应的明细记录。
创建外键时设置CASCADE的示例:
-- 创建主表 用户表 CREATE TABLE user ( id INT PRIMARY KEY, name VARCHAR(50) ); -- 创建从表 订单表,外键关联用户表的id,设置删除和更新都为CASCADE CREATE TABLE orders ( order_id INT PRIMARY KEY, user_id INT, order_amount DECIMAL(10,2), CONSTRAINT fk_user_orders FOREIGN KEY (user_id) REFERENCES user(id) ON DELETE CASCADE ON UPDATE CASCADE );
2. SET NULL(设为空值)
当主表的关联记录被删除或更新时,从表中对应记录的外键字段会被设置为NULL。使用该等级需要保证从表的外键字段允许为NULL,适合主表记录删除后从表记录仍需保留的场景,比如员工表和部门表,删除部门后将员工的部门id设为NULL。
设置SET NULL的示例:
-- 创建部门表 CREATE TABLE department ( dept_id INT PRIMARY KEY, dept_name VARCHAR(50) ); -- 创建员工表,外键关联部门表,删除和更新都设为SET NULL CREATE TABLE employee ( emp_id INT PRIMARY KEY, emp_name VARCHAR(50), dept_id INT, CONSTRAINT fk_dept_emp FOREIGN KEY (dept_id) REFERENCES department(dept_id) ON DELETE SET NULL ON UPDATE SET NULL );
3. RESTRICT(限制操作)
当从表中存在关联的主表记录时,拒绝执行主表的删除或更新操作,直接返回错误。这是mysql外键的默认约束等级,适合不允许主表关联数据变动的场景,避免误操作导致从表数据失去关联。
设置RESTRICT的示例:
-- 创建分类表 CREATE TABLE category ( cate_id INT PRIMARY KEY, cate_name VARCHAR(50) ); -- 创建商品表,外键关联分类表,使用RESTRICT约束 CREATE TABLE goods ( goods_id INT PRIMARY KEY, goods_name VARCHAR(100), cate_id INT, CONSTRAINT fk_cate_goods FOREIGN KEY (cate_id) REFERENCES category(cate_id) ON DELETE RESTRICT ON UPDATE RESTRICT );
4. NO ACTION(无操作)
NO ACTION的行为和RESTRICT完全一致,在mysql中两者是等价的,当从表存在关联记录时,主表的删除和更新操作会被拒绝。部分数据库标准中NO ACTION和RESTRICT存在差异,但mysql中两者没有区别。
5. SET DEFAULT(设为默认值)
当主表的关联记录被删除或更新时,从表的外键字段会被设置为预设的默认值。不过mysql的InnoDB引擎目前不支持SET DEFAULT等级,该等级更多在其他数据库中使用,设置时需要确认存储引擎是否支持。
约束等级的选择建议
实际开发中可以根据业务场景选择对应的约束等级:
- 如果主从表数据必须同步删除更新,优先选择CASCADE
- 如果主表记录删除后从表记录需要保留,且外键允许为空,选择SET NULL
- 如果不允许主表关联数据随意变动,选择默认的RESTRICT即可
- 避免使用SET DEFAULT,因为mysql的InnoDB引擎不支持该等级
另外需要注意,mysql中只有InnoDB引擎支持外键约束,MyISAM引擎不支持外键,创建表时需要确认存储引擎类型。同时外键字段的类型需要和主表关联字段的类型完全一致,否则无法创建外键约束。
mysql外键约束foreign_key数据库约束修改时间:2026-06-18 22:21:18