我想刪除學校表中的記錄,而不影響部門名稱的外鍵。我試過,但我得到這個消息:刪除不影響外鍵約束到其他表的主鍵
「無法刪除或更新父行,外鍵約束失敗 (
arusms
department
,約束department_ibfk_1
FOREIGN KEY (school_name
)參考文獻school
(school_name
)ON UPDATE 。 CASCADE)「
我想刪除學校表中的記錄,而不影響部門名稱的外鍵。我試過,但我得到這個消息:刪除不影響外鍵約束到其他表的主鍵
「無法刪除或更新父行,外鍵約束失敗 (
arusms
department
,約束department_ibfk_1
FOREIGN KEY (school_name
)參考文獻school
(school_name
)ON UPDATE 。 CASCADE)「
我不知道你爲什麼要這樣做。如果你刪除學校,該部門將成爲孤兒。這就是爲了強制引用完整性而將外鍵放在首位。如果您希望部門保留並能夠執行此操作,則需要更改外鍵以包含ON DELETE SET NULL。否則,您將必須刪除約束,執行刪除並重新創建約束。
如果刪除約束並執行刪除,那麼您將無法重新創建約束:) – 2012-04-20 06:59:06
@ypercube:如果將foreign_key_checks設置爲0,則可以。實際上,這比刪除它容易。將foreign_key_checks設置爲0,刪除記錄,將foreign_key_checks設置爲1.這是一個骯髒的黑客攻擊,但我不明白首先想做這件事的原因。 – mdoyle 2012-04-20 14:21:26
非常感謝您的出色答案 – 2012-04-21 13:22:21
擁有外鍵的全部目的是保持數據一致。就你而言,這意味着對於每個department
,必須存在對應的school
記錄。如果你是一所學校,所有相應的部門也應該刪除,或者至少他們的school
參考文獻必須是NULL
ed。
如果你不需要這種強制執行,DROP
的外鍵。
另外,如果你只是想重新分配一個部門到另一所學校,首先要做的是,然後纔是原來的學校DELETE
。
非常感謝您的好回答 – 2012-04-21 13:22:31
@AntwenySawe考慮將其中一個答案標記爲已接受。 – 2012-04-21 17:50:28
您的錯誤信息隱藏了真正的原因。
(
arusms.department,
CONSTRAINT department_ibfk_1
FOREIGN KEY (school_name)
REFERENCES school (school_name)
ON UPDATE CASCADE
)
創建外鍵constarint時,省略了ON DELETE
部分。 MySQL爲此使用了默認操作,即ON DELETE RESTRICT
。查看MySQL的文檔:FOREIGN KEY
Constraints
如果您希望能夠刪除學校沒有層疊效果到相關部門,你可以
刪除FK約束或
使列(department.school_name
)可以爲空並更改約束以使ON DELETE SET NULL
操作。
如果您希望能夠刪除的學校和級聯刪除相關部門,你可以
ON DELETE CASCADE
行動。非常感謝您的回答 – 2012-04-21 13:22:48
請問您可以展示您的數據庫是如何設置的? – simchona 2012-04-19 16:29:30
我認爲這可能是不可能的。你爲什麼需要這樣做? – 2012-04-19 16:29:44
如果一個部門是學校的一部分,並且您刪除了該學校,這意味着該部門也不在了。你所問的沒有意義。 – 2012-04-19 16:31:37