这些约束如何导致循环或多个级联路径?

时间:2020-04-12 21:23:48

标签: sql sql-server foreign-keys cascade

注意:这个问题更多的是关于数据库设计和SQL Server的,而不是像EF Core这样的特定ORMDB。

我有一个如下所示的数据库架构:

enter image description here

使用EF Core Migration,所有SQL语句都可以运行到最后一个约束(FK_BookReleases_Nicknames_NicknameId)。可以添加以前的FK FK_BookReleases_Books_BookId

我收到的错误是(与关于SO的许多其他文章一样):

介绍FOREIGN KEY约束 表“ BookReleases”上的“ FK_BookReleases_Nicknames_NicknameId”可能 导致循环或多个级联路径。指定ON DELETE NO ACTION或 ON UPDATE NO ACTION,或修改其他FOREIGN KEY约束。

我的问题是,该设计的缺陷在哪里?我无法理解在任何逻辑上都会发生这种情况。正确的解决方法是什么?我看到许多建议更改ON DELETE动作的建议,但没有具体说明我应该使用哪个FK以及其他什么动作。

更糟糕的是,即使已经读过this article,我仍然不明白这可能是一个问题,以及他提出的解决方案如何适合上述方案。

1 个答案:

答案 0 :(得分:1)

该问题是由于从作者(祖父母)到BookRelease(孙子女)的多个层叠路径造成的。有两种级联路径:

  1. 作者->图书-> BookRelease
  2. 作者->昵称-> BookRelease

post in MSSQLTips

中对此进行了详细讨论

Multiple Cascading Paths

因此,处理此问题的方法是:

  1. 禁用ON DELETE CASCAE,然后选择NOACTION作为外键创建。

  2. 在Author(GrandParent),Book(Child1),Nickname(Child2)表中创建INSTEAD OF DELETE触发器,以处理子表中父键的删除。

  • 祖父母删除::先删除GrandChild,然后再删除Child1, 其次是Child2
  • Child1删除:在GrandChild中删除,然后进行 由Child1
  • 删除Child2 :先删除GrandChild,再删除Child2