2012-04-19 108 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