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;
⚠️ 風險警告:
DELETE FROM child_table WHERE parent_id = 123;
DELETE FROM parent_table WHERE id = 123;
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;
之後直接刪父表,子表自動同步刪除。
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。