2012-10-30 61 views
0

我無法從數據庫對象中刪除一行。在我的情況下,db對象正在自我編制索引。
字段root_id與key_id(主鍵)具有外鍵關係。參照完整性設計爲ON UPDATE NO ACTION AND ON DELETE NO ACTION。即使我仍然無法刪除。無法從自我索引的數據庫對象中刪除記錄

CONSTRAINT `fk_MyTab` FOREIGN KEY (`root_id`) REFERENCES `MyTab` (`key_id`) ON DELETE NO ACTION ON UPDATE NO ACTION) 

我必須刪除此表中的記錄WHERE key_id = root_id
當我嘗試刪除時,我收到以下內容。

錯誤代碼:1451。無法刪除或更新父行,外鍵約束失敗(`MyTab`,約束`fk_MyTab`外鍵(`root_id`)參考`MyTab`(`key_id`)ON刪除沒有行動更新沒有行動)

指向我的方向是正確的。

回答

1

這就是NO ACTION所做的,它可以防止刪除任何子行的行。如果您還想刪除孩子,請使用CASCADE

您也可以通過將其設置爲ON DELETE SET NULL來保留數據,在這種情況下,如果父項被刪除,則子行將其外鍵列設置爲空。

+0

Hai @Asad,需要澄清一下。這是MySQL中的bug還是所有數據庫服務器都是常見的? – vissu

+0

@vissu這不是一個bug,它是一個錯誤功能;所有數據庫服務器都有類似的功能,如果要防止任何有子行被刪除的行,請使用'NO ACTION'。 –

1

我覺得在設計一個擁有大量外鍵的數據庫時,這是一個很好的做法。如果您的表具有ON DELETE CASCADE選項,並且這些表與其他字段鏈接到其他表,則刪除級聯選項將失敗(因爲mysql無法以與創建表相同的順序刪除)「。此案例的解決方案是聲明子句ON DELETE SET其他外鍵NULL NULL

+0

這正是我發佈的內容嗎? –

+0

不準確。意思是一樣的,因爲這個解決方案。 – vijikumar