2012-06-19 81 views
32

在MySQL中我想刪除一個表。
我嘗試了很多事情,但我一直收到錯誤,表名爲bericht的表不能被刪除。這是我得到的錯誤:不能刪除表:外鍵約束失敗

#1217 - 無法刪除或更新父行,外鍵約束失敗

如何刪除該表?

+2

找出其他表通過外鍵引用它,並首先刪除該表上的FK約束,然後刪除該表。 –

+0

您需要刪除其他表格上的其他表格而不需要其他表格 – BugFinder

+1

這些答案中的任何一個對您有幫助嗎? http://stackoverflow.com/questions/1905470/cannot-delete-or-update-a-parent-row-a-foreign-key-constraint-fails http://stackoverflow.com/questions/3334619/can not-delete-or-update-a-parent-row-a-foreign-key-constraint-failures –

回答

44

試試這個:

SELECT * 
FROM information_schema.KEY_COLUMN_USAGE 
WHERE REFERENCED_TABLE_NAME = 'YourTable'; 

這應該救你哪些表必須要下降,一旦放棄了這些引用,或引用數據集在該表中的數據集,你就可以刪除該表

+4

此解決方案更好。這樣更安全,並且不像所選答案那樣不好。 – Sloganho

+1

它爲我工作,這個答案應該標記爲接受。 – parvez

68

這應該做的表引用訣竅:

SET FOREIGN_KEY_CHECKS=0; DROP TABLE bericht; SET FOREIGN_KEY_CHECKS=1; 

正如其他人所指出的,這是幾乎從來沒有你想要的東西,即使它是什麼在這個問題問。更安全的解決方案是在刪除bericht之前根據bericht刪除表。請參閱CloudyMarble關於如何做到這一點的答案。當我不想或者不能刪除並重新創建數據庫本身時,我使用bash和我的文章中的方法刪除數據庫中的所有表。

#1217錯誤發生在其他表有外鍵約束您試圖刪除,並且您使用的是InnoDB數據庫引擎的表。此解決方案暫時禁用檢查限制,然後重新啓用它們。閱讀documentation瞭解更多信息。一定要刪除外鍵約束和字段取決於bericht表,否則你可能會離開你的數據庫處於中斷狀態。

+2

這應該選擇回答 – kyeno

+0

到現在這是最好的答案,應該在頂部!!!!!! –

+1

雖然這是正確的,但這是一個令人驚訝的不良做法。正如多位用戶(包括Rune Kaagaard)指出的那樣,您應該根據需要找到參考資料,分析並放棄它們。 – zozo

1

這可能與其他模式具有相同的表格,因此您會收到該錯誤。

您需要首先刪除子行然後刪除父行。

0

我意識到這是過時了一段時間,並已選擇一個答案,但如何對替代允許的外鍵是NULL,然後選擇ON DELETE SET NULL

基本上,你的表應該改變像這樣:

ALTER TABLE 'bericht' DROP FOREIGN KEY 'your_foreign_key';

ALTER TABLE 'bericht' ADD CONSTRAINT 'your_foreign_key' FOREIGN KEY ('column_foreign_key') REFERENCES 'other_table' ('column_parent_key') ON UPDATE CASCADE ON DELETE SET NULL;

個人而言,我會建議使用兩個 「ON UPDATE CASCADE」 以及 「ON DELETE SET NULL」,以避免不必要的併發症,但是你的設置可能決定了不同的方法。

希望這會有所幫助。