2012-04-19 117 views
2

我想刪除學校表中的記錄,而不影響部門名稱的外鍵。我試過,但我得到這個消息:刪除不影響外鍵約束到其他表的主鍵

「無法刪除或更新父行,外鍵約束失敗 (arusmsdepartment,約束department_ibfk_1 FOREIGN KEY (school_name)參考文獻schoolschool_name)ON UPDATE 。 CASCADE)「

+0

請問您可以展示您的數據庫是如何設置的? – simchona 2012-04-19 16:29:30

+0

我認爲這可能是不可能的。你爲什麼需要這樣做? – 2012-04-19 16:29:44

+0

如果一個部門是學校的一部分,並且您刪除了該學校,這意味着該部門也不在了。你所問的沒有意義。 – 2012-04-19 16:31:37

回答

2

我不知道你爲什麼要這樣做。如果你刪除學校,該部門將成爲孤兒。這就是爲了強制引用完整性而將外鍵放在首位。如果您希望部門保留並能夠執行此操作,則需要更改外鍵以包含ON DELETE SET NULL。否則,您將必須刪除約束,執行刪除並重新創建約束。

+0

如果刪除約束並執行刪除,那麼您將無法重新創建約束:) – 2012-04-20 06:59:06

+0

@ypercube:如果將foreign_key_checks設置爲0,則可以。實際上,這比刪除它容易。將foreign_key_checks設置爲0,刪除記錄,將foreign_key_checks設置爲1.這是一個骯髒的黑客攻擊,但我不明白首先想做這件事的原因。 – mdoyle 2012-04-20 14:21:26

+0

非常感謝您的出色答案 – 2012-04-21 13:22:21

1

擁有外鍵的全部目的是保持數據一致。就你而言,這意味着對於每個department,必須存在對應的school記錄。如果你是一所學校,所有相應的部門也應該刪除,或者至少他們的school參考文獻必須是NULL ed。

如果你不需要這種強制執行,DROP的外鍵。

另外,如果你只是想重新分配一個部門到另一所學校,首先要做的是,然後纔是原來的學校DELETE

+0

非常感謝您的好回答 – 2012-04-21 13:22:31

+0

@AntwenySawe考慮將其中一個答案標記爲已接受。 – 2012-04-21 17:50:28

0

您的錯誤信息隱藏了真正的原因。

(
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行動。
+0

非常感謝您的回答 – 2012-04-21 13:22:48