【问题标题】:How do I correct this ('Cannot delete or update a parent row')?如何更正此问题(“无法删除或更新父行”)?
【发布时间】:2016-12-21 02:42:31
【问题描述】:
mysql> delete from faculty where fid in ( select fid from class);

ERROR 1451 (23000):无法删除或更新父行:外部 键约束失败 (ass1.class, CONSTRAINT class_ibfk_1 外键 (fid) 引用 faculty (fid))

这是抛出上述错误。我该怎么办?

【问题讨论】:

  • 你有级联删除吗?如果没有,则不能在删除(或移动)子行之前删除父行。

标签: mysql sql


【解决方案1】:

在不知道后果的情况下强行这样做是很危险的。

发生此错误是因为有另一个表与您要删除的内容具有外键关联。您希望其他表中依赖于已删除数据的那些行发生什么情况?这里有几个选项:

  • 如果您想删除那些依赖于您尝试删除的数据的行,请查看cascade deletion
  • 如果您决定依赖于您需要删除的数据的数据不再具有外键约束,您可以drop the constraint
  • 如果您不想要这些东西,请考虑不要实际删除您的数据,而是使用布尔列将行标记为“非活动”。然后,如果需要,您可以在检索数据时对标志进行过滤,同时仍保留依赖于“过时”数据的旧记录。

【讨论】:

    【解决方案2】:

    您正在尝试从父表中删除。这可能就是您收到错误的原因。

    【讨论】:

    • 那么我们还有什么办法可以做到吗?
    【解决方案3】:

    将 FK 设置为级联删除:

    YourForeignIDField INT NOT NULL REFERENCES ParentTable.ID ON UPDATE CASCADE ON DELETE CASCADE
    

    或者设置外来ID接受Nulls并级联为null:

    YourForeignIDField INT NULL REFERENCES ParentTable.ID ON UPDATE CASCADE ON DELETE SET NULL
    

    或者先删除所有子节点:

    DELETE FROM ChildTable WHERE ForeignID = YourForgeignID;
    DELETE FROM ParentTable WHERE ID = YourID;
    

    【讨论】:

      猜你喜欢
      • 2020-01-10
      • 1970-01-01
      • 1970-01-01
      • 2017-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-30
      • 1970-01-01
      相关资源
      最近更新 更多