ERROR 1701 (42000): Cannot truncate a table referenced in a foreign key constraint
(`laravel-test`.`bl_role_user`, CONSTRAINT `role_user_role_id_foreign`
FOREIGN KEY (`role_id`) REFERENCES `laravel-test`.`bl_roles` (`id`))
原因:TRUNCATE TABLE 會隱式提交並嘗試快速刪除整表,但 InnoDB 偵測到有**子表透過外鍵引用此表**,為維護參考完整性直接拒絕。
SET FOREIGN_KEY_CHECKS = 0; -- 1. 關閉外鍵檢查
TRUNCATE TABLE bl_roles; -- 2. 執行清空
SET FOREIGN_KEY_CHECKS = 1; -- 3. 立即恢復檢查
SET FOREIGN_KEY_CHECKS = 0 預設為 **SESSION 級**,僅影響當前連線。SET GLOBAL FOREIGN_KEY_CHECKS = 0,全庫外鍵失效,極度危險。| 方案 | 優點 | 缺點 | 適用場景 |
|---|---|---|---|
SET FK=0; TRUNCATE; SET FK=1; | 極快、不產生 Binlog 大量行刪除、重置自增 ID | 需確保無孤兒資料、暫時失去 FK 保護 | 開發/測試/重建環境、大表清空重載 |
DELETE FROM table; | 觸發 FK CASCADE/RESTRICT、產生 Binlog、可回滾 | 慢、產生大量 Undo/Redo、不重置自增 ID | 生產少量刪除、需審計追蹤 |
| 刪除 FK → TRUNCATE → 重建 FK | 徹底乾淨 | 需鎖表、DDL 耗時、鎖定元資料 | 結構變更窗口 |