【问题标题】:Delete a Primary Key Without Affecting Foreign Key Constrain to Other Table删除主键而不影响对另一个表的外键约束
【发布时间】:2012-04-19 16:27:11
【问题描述】:

我想在不影响系名外键的情况下从学校表中删除一条记录。我试过了,但我收到了这条消息:

"无法删除或更新父行:外键约束失败 (arusms.department,约束department_ibfk_1外键 (school_name) 参考资料school (school_name) 更新 级联)”

【问题讨论】:

  • 您能说明一下您的数据库是如何设置的吗?
  • 我认为这可能是不可能的。为什么需要这样做?
  • 如果一个部门是学校的一部分,而你删除了学校,这意味着该部门也消失了。你问的没有意义。

标签: mysql


【解决方案1】:

我不确定您为什么要这样做。如果您删除学校,该部门将成为孤儿。这就是首先使用外键来强制引用完整性的重点。如果您希望部门保留并能够执行此操作,则需要更改外键以包含 ON DELETE SET NULL。否则,您将不得不删除约束、执行删除并重新创建约束。

【讨论】:

  • 如果删除约束并执行删除,那么您将无法重新创建约束:)
  • @ypercube :如果您将 foreign_key_checks 设置为 0,那么您可以。实际上,这比删除它更容易。将 foreign_key_checks 设置为 0,删除记录,将 foreign_key_checks 设置为 1。这是一个肮脏的 hack,但同样,我不明白首先要这样做的原因。
  • 非常感谢您的精彩回答
【解决方案2】:

您的错误信息隐藏了真正的原因。

(
arusms.department, 

CONSTRAINT department_ibfk_1 
  FOREIGN KEY (school_name) 
  REFERENCES school (school_name) 
  ON UPDATE CASCADE
)

当您创建外键约束时,您省略了ON DELETE 部分。 MySQL 为此使用了默认操作,即 ON DELETE RESTRICT。请参阅 MySQL 文档:FOREIGN KEY Constraints

如果您希望能够删除学校而不会对相关部门产生级联影响,您可以

  • 移除 FK 约束或

  • 使列 (department.school_name) 可以为空并更改约束以具有 ON DELETE SET NULL 操作。

如果你希望能够删除学校和级联删除相关部门,你可以

  • 更改约束以具有ON DELETE CASCADE 操作。

【讨论】:

  • 非常感谢您的精彩回答
【解决方案3】:

拥有外键的全部目的是保持数据一致。在您的情况下,这意味着对于每个department,必须存在相应的school 记录。如果你DELETE一个学校,所有相应的部门也应该被删除,或者至少他们的school引用必须是NULLed。

如果您不需要这种强制执行,DROP 外键。

或者,如果您只想将一个部门重新分配到另一所学校,请先执行此操作,然后再 DELETE 原来的学校。

【讨论】:

  • 非常感谢您的精彩回答
猜你喜欢
  • 2011-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多