MySQL数据库外键删除与更新行为示例详解

 更新时间:2026年08月30日 10:35:19   作者:冰暮流星  
本文详细介绍MySQL外键的删除与更新行为,帮助你在数据库设计时做出合理选择,本文结合实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧

核心结论:MySQL(InnoDB 引擎)外键的 ON DELETE / ON UPDATE 行为决定父表记录变更时子表的响应策略;‌默认行为为 RESTRICT(等同于 NO ACTION)‌,即若子表存在关联记录则拒绝父表操作;SET DEFAULT 语法支持但 InnoDB 实际拒绝执行。

1. 引言

在 MySQL 中,外键(Foreign Key)用于建立表与表之间的关联关系,并保证数据的引用完整性。当父表(被引用表)中的数据发生删除或更新时,子表(引用表)中的关联数据如何响应,取决于外键约束中定义的删除行为和更新行为。本文详细介绍 MySQL 外键的删除与更新行为,帮助你在数据库设计时做出合理选择。

2. 外键约束基础

外键约束在创建表时通过 FOREIGN KEY 子句定义,语法如下:

CREATE TABLE child_table (
    id INT PRIMARY KEY,
    parent_id INT,
    FOREIGN KEY (parent_id) REFERENCES parent_table(id)
    ON DELETE 行为
    ON UPDATE 行为
);

其中 ON DELETEON UPDATE 分别指定父表记录被删除和更新时,子表关联记录的处理方式。MySQL 支持以下五种行为:

  • CASCADE:级联操作,父表删除或更新时,子表关联记录同步删除或更新。
  • SET NULL:父表删除或更新时,将子表外键列设置为 NULL
  • RESTRICT:拒绝操作,存在关联记录时禁止删除或更新父表记录。
  • NO ACTION:与 RESTRICT 类似,在 MySQL 中两者等价。
  • SET DEFAULT:MySQL 解析但拒绝该行为,实际使用中不可用。

3. 删除行为详解

3.1 CASCADE(级联删除)

当父表记录被删除时,子表中所有引用该记录的行也会被自动删除。适用于父子关系强绑定、子记录离开父记录无意义的场景,例如删除订单时同时删除订单明细。

CREATE TABLE orders (
    order_id INT PRIMARY KEY
);
CREATE TABLE order_items (
    item_id INT PRIMARY KEY,
    order_id INT,
    FOREIGN KEY (order_id) REFERENCES orders(order_id)
    ON DELETE CASCADE
);

执行 DELETE FROM orders WHERE order_id = 1; 时,order_items 中所有 order_id = 1 的记录会被一并删除。

3.2 SET NULL(置空)

父表记录被删除时,子表外键列被设置为 NULL。使用该行为要求子表外键列允许 NULL,适用于父子关系可选、子记录可独立存在的场景,例如删除部门后保留员工记录但部门字段置空。

CREATE TABLE employees (
    emp_id INT PRIMARY KEY,
    dept_id INT NULL,
    FOREIGN KEY (dept_id) REFERENCES departments(dept_id)
    ON DELETE SET NULL
);

3.3 RESTRICT 与 NO ACTION(拒绝删除)

当子表存在引用父表记录的关联行时,删除父表记录会被拒绝并报错。这是 MySQL 的默认行为,适用于需要严格保护历史数据的场景,例如有订单明细的订单不允许直接删除。

CREATE TABLE child_table (
    id INT PRIMARY KEY,
    parent_id INT,
    FOREIGN KEY (parent_id) REFERENCES parent_table(id)
    ON DELETE RESTRICT
);

在 MySQL 中,NO ACTIONRESTRICT 行为完全一致,区别仅在于检查时机:RESTRICT 立即检查,NO ACTION 在约束检查时执行,但 InnoDB 引擎下两者等价。

4. 更新行为详解

4.1 CASCADE(级联更新)

父表主键值更新时,子表外键值同步更新。适用于主键可能变化且需要保持引用一致性的场景,例如重新分配 ID 时自动同步子表。

CREATE TABLE child_table (
    id INT PRIMARY KEY,
    parent_id INT,
    FOREIGN KEY (parent_id) REFERENCES parent_table(id)
    ON UPDATE CASCADE
);

执行 UPDATE parent_table SET id = 100 WHERE id = 1; 时,子表中所有 parent_id = 1 的记录会自动更新为 100

4.2 SET NULL(置空)

父表主键更新时,子表外键列被设置为 NULL。同样要求外键列允许 NULL,适用于父记录标识变化后不再需要关联子记录的场景。

4.3 RESTRICT 与 NO ACTION(拒绝更新)

当子表存在引用父表记录的关联行时,更新父表主键会被拒绝。这是 MySQL 的默认行为,适用于主键不应随意变更的业务场景。

5. 行为组合与使用建议

删除行为和更新行为可以独立组合,例如 ON DELETE CASCADE ON UPDATE RESTRICT。实际设计时建议遵循以下原则:

  • 强依赖关系:子记录离开父记录无意义时,使用 CASCADE
  • 弱依赖关系:子记录可独立存在时,使用 SET NULL
  • 数据保护:需要防止误删误改时,使用 RESTRICTNO ACTION
  • 避免级联链过长:多层 CASCADE 可能导致大量数据被意外删除,需谨慎设计。

6. 总结

MySQL 外键的删除与更新行为是保证数据引用完整性的核心机制。CASCADE 适合强关联场景,SET NULL 适合弱关联场景,RESTRICTNO ACTION 用于保护数据不被误操作。合理选择行为组合,可以在数据一致性和业务灵活性之间取得平衡。

实践建议:优先采用 RESTRICT 保障数据完整性;仅在强从属关系(如订单明细→订单)中使用 CASCADE;避免依赖数据库自动清理,关键业务应在应用层控制生命周期。

到此这篇关于MySQL外键删除与更新行为详解的文章就介绍到这了,更多相关mysql外键删除与更新行为内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • mysql 5.7 zip 文件在 windows下的安装教程详解

    mysql 5.7 zip 文件在 windows下的安装教程详解

    这篇文章主要介绍了mysql 5.7 zip 文件在 windows下的安装步骤,首先我们需要先下载mysql最新版本然后解压文件夹,本文介绍的非常详细,具有参考借鉴价值,需要的朋友可以参考下
    2016-09-09
  • MySQL实战教程之Join语句执行流程

    MySQL实战教程之Join语句执行流程

    这篇文章主要介绍了MySQL Join语句执行流程,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-03-03
  • MySQL 主从复制原理与实践详解

    MySQL 主从复制原理与实践详解

    这篇文章主要介绍了MySQL 主从复制原理与实践,结合实例形式分析了MySQL 主从复制基本概念、原理、实现方法与相关注意事项,需要的朋友可以参考下
    2020-05-05
  • mysql免安装制作使用说明

    mysql免安装制作使用说明

    mysql免安装版本的制作方法,需要的朋友可以参考下。
    2010-08-08
  • mysql报错sql_mode=only_full_group_by解决

    mysql报错sql_mode=only_full_group_by解决

    这篇文章主要为大家介绍了mysql报错sql_mode=only_full_group_by解决,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • MySQL之模糊查询特殊字符处理方式

    MySQL之模糊查询特殊字符处理方式

    这篇文章主要介绍了MySQL之模糊查询特殊字符处理方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • OpenEuler系统MySQL故障排查终极指南实战教程

    OpenEuler系统MySQL故障排查终极指南实战教程

    本文介绍了在OpenEuler系统中针对/usr/local/mysql安装路径的MySQL服务进行全面故障排查、根因定位、解决方案及性能优化的方法,感兴趣的朋友跟随小编一起看看吧
    2026-04-04
  • MySQL递归查询树状表的子节点、父节点具体实现

    MySQL递归查询树状表的子节点、父节点具体实现

    本程序写了两个sql存储过程,子节点查询算是照搬了,父节点查询是逆思维弄的
    2014-03-03
  • MySQL GPG密钥过期问题及解决方案

    MySQL GPG密钥过期问题及解决方案

    作者在CentOS7上on执行make编译时遇到找不到mysql.h头头文件的问题,通过安装相关包暂时解决,后at尝试安装MySQL相关包时遇到GPG密钥已过期问题,最终解决方案是在执行安装程序之前导入MySQL公钥,然后使用`yum installmysql-devel`命令安装
    2026-05-05
  • MySQL的一些常用的SQL语句整理

    MySQL的一些常用的SQL语句整理

    这篇文章主要介绍了MySQL的一些常用的SQL语句整理,非常基础,适合随看随记:)需要的朋友可以参考下
    2015-07-07

最新评论