建表語句
-- 父表
CREATE TABLE a (
name CHAR(20) NOT NULL,
id CHAR(20) NOT NULL PRIMARY KEY
) ENGINE=InnoDB;
-- 子表,定義外鍵並啟用級聯刪除
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 ('1','1'); -- 成功,父表存在 id=1
INSERT INTO b VALUES ('1','3'); -- 失敗,父表無 id=3,外鍵約束攔截
級聯刪除演示
DELETE FROM a WHERE id = '1';
-- 結果:父表 a 刪除 id=1 行,子表 b 中 b_id='1' 的行自動被刪除
其他級聯選項
| 子句 | 行為 |
ON DELETE CASCADE | 刪除父行時,自動刪除子表關聯行 |
ON DELETE SET NULL | 刪除父行時,子表外鍵欄位設為 NULL(欄位必須允許 NULL) |
ON DELETE RESTRICT | 有子行存在時禁止刪除父行(預設) |
ON DELETE NO ACTION | 同 RESTRICT,標準 SQL 語法 |
ON UPDATE CASCADE | 更新父鍵值時,同步更新子表外鍵值 |
使用建議
- 級聯刪除威力大,誤操作可能連鎖刪除大量資料,生產環境建議:
1. 關鍵業務表不使用 CASCADE,改由應用層控制。
2. 若使用,務必配合軟刪除(狀態欄位)或備份/延遲刪除機制。
3. 測試環境充分驗證級聯路徑。
- 外鍵會增加寫入開銷(鎖檢查),高併發寫入場景可考慮應用層維護參考完整性。
copyright ©
萬盛學電腦網 all rights reserved