外鍵約束配合 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 |
is_deleted=1) 替代。ERROR 1215。mysqldump 匯出含 FK 定義,匯入時需關閉 foreign_key_checks=0 再開啟。外鍵級聯是資料完整性的「安全網」,但高併發寫入場景下需謹慎評估鎖衝擊,權衡「強一致性」與「可用性」。