首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 外鍵級聯操作實戰:ON DELETE CASCADE 自動維護關聯資料完整性

     編輯:MySQL 資料庫相關知識

外鍵約束配合 ON DELETE CASCADE 可在父表刪除時自動清理子表關聯資料,避免孤兒資料與應用層手動刪除的疏漏。

建表示例


-- 父表
CREATE TABLE a (
  name CHAR(20) NOT NULL,
  id CHAR(20) NOT NULL PRIMARY KEY
) ENGINE=InnoDB;

-- 子表:b_id 參考 a.id,級聯刪除
CREATE TABLE b (
  b_name CHAR(20) NOT NULL,
  b_id CHAR(20) NOT NULL,
  CONSTRAINT fk_b_a FOREIGN KEY (b_id) REFERENCES a(id) ON DELETE CASCADE
) ENGINE=InnoDB;

驗證流程


-- 插入父資料
INSERT INTO a VALUES ('111','1'), ('222','2');

-- 插入子資料 (成功)
INSERT INTO b VALUES ('child1','1');

-- 插入不存在父鍵 (失敗:FK 約束)
INSERT INTO b VALUES ('childX','3');  -- ERROR 1452

-- 刪除父資料 → 子資料自動刪除
DELETE FROM a WHERE id='1';
SELECT * FROM b;  -- 空結果,級聯生效

級聯動作完整對照

子句觸發時機行為
ON DELETE CASCADE父表 DELETE自動刪除子表匹配行
ON DELETE SET NULL父表 DELETE子表 FK 欄位設為 NULL (需允許 NULL)
ON DELETE RESTRICT父表 DELETE阻止刪除 (預設)
ON DELETE NO ACTION父表 DELETE同 RESTRICT (標準 SQL)
ON UPDATE CASCADE父表 PK UPDATE自動更新子表 FK

生產環境避坑指南

  • 必須使用 InnoDB:MyISAM 不支援外鍵。
  • 大量級聯刪除會產生大事務:長時間鎖表、Binlog 膨脹、主從延遲,建議應用層分批軟刪 (is_deleted=1) 替代。
  • 循環引用禁止:A→B→A 會報錯 ERROR 1215。
  • 工具兼容性:mysqldump 匯出含 FK 定義,匯入時需關閉 foreign_key_checks=0 再開啟。

外鍵級聯是資料完整性的「安全網」,但高併發寫入場景下需謹慎評估鎖衝擊,權衡「強一致性」與「可用性」。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved