萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

MySQL 刪除資料報錯 "Cannot delete or update a parent row" 外鍵約束阻擋解決

錯誤現象

Cannot delete or update a parent row: a foreign key constraint fails

原因:InnoDB 表存在外鍵約束,父表記錄被子表引用,預設 ON DELETE RESTRICT 阻擋刪除/更新。

臨時繞過:關閉外鍵檢查(極度謹慎)

SET FOREIGN_KEY_CHECKS = 0;
DELETE FROM parent_table WHERE id = 123;  -- 或 UPDATE
SET FOREIGN_KEY_CHECKS = 1;

⚠️ 風險警告:

  • 會留下**孤兒記錄**(子表指向不存在的父 ID),破壞資料完整性。
  • 後續業務邏輯可能報錯、報表數據不一致。
  • 僅限**緊急搶障/資料清理**且確認後果可控時使用。

正規解決方案

1. 先刪除子表關聯記錄

DELETE FROM child_table WHERE parent_id = 123;
DELETE FROM parent_table WHERE id = 123;

2. 修改外鍵為 CASCADE(自動級聯)

ALTER TABLE child_table DROP FOREIGN KEY fk_name;
ALTER TABLE child_table
ADD CONSTRAINT fk_name FOREIGN KEY (parent_id)
REFERENCES parent_table(id)
ON DELETE CASCADE ON UPDATE CASCADE;

之後直接刪父表,子表自動同步刪除。

3. 修改為 SET NULL(保留子記錄)

ALTER TABLE child_table
MODIFY parent_id INT NULL;  -- 先允許 NULL

ALTER TABLE child_table DROP FOREIGN KEY fk_name;
ALTER TABLE child_table
ADD CONSTRAINT fk_name FOREIGN KEY (parent_id)
REFERENCES parent_table(id)
ON DELETE SET NULL ON UPDATE SET NULL;

排查當前外鍵定義

SHOW CREATE TABLE child_table\G
-- 輸出中找 CONSTRAINT ... FOREIGN KEY ... REFERENCES ... ON DELETE ... ON UPDATE ...

-- 或查詢 information_schema
SELECT CONSTRAINT_NAME, TABLE_NAME, REFERENCED_TABLE_NAME, DELETE_RULE, UPDATE_RULE
FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS
WHERE CONSTRAINT_SCHEMA = 'your_db';

最佳實踐

  • 設計階段即明確業務語義選擇 CASCADE/SET NULL/RESTRICT。
  • 高並發核心鏈路慎用外鍵(鎖擴大、死鎖風險),改由應用層事務保證一致性。
  • 若必須用外鍵,**務必在子表外鍵欄位建立索引**(5.6+ 自動建立,舊版手動)。
copyright © 萬盛學電腦網 all rights reserved