首页/数据/SQL 速查/级联删除与外键动作
本包目录(311 条)
查询基础33 条连接与子查询40 条聚合与窗口函数54 条函数速查60 条
变更与事务52 条
性能与执行计划72 条

级联删除与外键动作

外键的 ON DELETE 动作决定父行删除时子行的命运:CASCADE 连带删除、SET NULL 置空、RESTRICT/NO ACTION 阻止删除。

SQL 速查数据更新于 2026-10-12

示例

示例
CREATE TABLE order_items (
  id       BIGINT PRIMARY KEY,
  order_id BIGINT NOT NULL,
  CONSTRAINT fk_order FOREIGN KEY (order_id)
    REFERENCES orders (id)
    ON DELETE CASCADE
);

-- 删除父行会连带删除明细
DELETE FROM orders WHERE id = 100;
CASCADE父行删除时自动删子行(无声、影响范围大)
SET NULL子行外键列置空(列必须可空)
RESTRICT / NO ACTION存在子行时阻止删除(默认行为)
执行删除前先查清引用关系:information_schema.REFERENTIAL_CONSTRAINTS 与 KEY_COLUMN_USAGE 可以列出指向该表的全部外键。

易错点

  • 一条 DELETE 通过级联删掉整棵子图是常见事故场景,删除父表数据前先明确级联范围
  • MySQL 与 PG 对 SET NULL 都要求列可空;DDL 变更列可空性前先处理存量外键

数据来源与参考

  • MySQL 8.0 Reference Manual · FOREIGN KEY Constraints
  • PostgreSQL Documentation · Foreign Keys
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌