首页 > 解决方案 > 这些约束如何可能导致循环或多个级联路径?

问题描述

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

我有一个看起来像这样的数据库模式:

在此处输入图像描述

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

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

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

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

更糟糕的是,即使已经阅读了这篇文章,我仍然不明白这怎么可能是一个问题,以及他提出的解决方案如何适合上述模式。

标签: sqlsql-serverforeign-keyscascade

解决方案


问题是由于从作者(祖父)到 BookRelease(孙子)的多个级联路径。有两条级联路径:

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

这在 MSSQLTips中的帖子中有详细讨论

多级联路径

所以,处理这个问题的方法是:

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

  2. 在 Author(GrandParent)、Book(Child1)、Nickname(Child2) 表中创建 INSTEAD OF DELETE TRIGGERS 来处理子表中父键的删除。

  • Grand Parent 删除:在 GrandChild 中删除,然后是 Child1,然后是 Child2,
  • Child1删除:在GrandChild中删除,后跟Child1
  • Child2删除:在GrandChild中删除,后跟Child2

推荐阅读