这些约束如何可能导致循环或多个级联路径?
How can these constraints may cause cycles or multiple cascade paths?
注意:这个问题更多是关于数据库设计和 SQL 服务器,而不是像 EF Core 这样的特定 ORMDB。
我有一个如下所示的数据库架构:
使用 EF Core 迁移,所有 SQL 语句都可以 运行 直到最后一个约束 (FK_BookReleases_Nicknames_NicknameId
)。可以添加之前的FKFK_BookReleases_Books_BookId
我收到的错误是(关于 SO 的许多其他文章):
Introducing FOREIGN KEY constraint
'FK_BookReleases_Nicknames_NicknameId' on table 'BookReleases' may
cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or
ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints.
我的问题是,该设计的缺陷在哪里?我无法理解这种情况发生在任何逻辑下。什么是正确的解决方法?我看到许多建议更改 ON DELETE
操作,但没有具体说明我应该使用哪个 FK 以及其他什么操作。
更糟糕的是,即使已经阅读 this article 我仍然不明白这怎么可能是个问题,以及他提出的解决方案如何适合上述模式。
问题是由于从作者(祖父)到 BookRelease(孙子)的多个级联路径。有两个级联路径:
- 作者 -> 书籍 -> BookRelease
- 作者 -> 昵称 -> BookRelease
中有详细讨论
所以,处理方法是:
禁用 ON DELETE CASCAE 并选择 NOACTION 作为外键创建。
在 Author(GrandParent)、Book(Child1)、Nickname(Child2) 表中创建 INSTEAD OF DELETE TRIGGERS 来处理子表中父键的删除。
- Grand Parent deletion : Delete in GrandChild, followed by Child1,
followed by Child2,
- Child1 deletion: Delete in GrandChild, followed
by Child1
- Child2 deletion: Delete in GrandChild, followed by Child2
注意:这个问题更多是关于数据库设计和 SQL 服务器,而不是像 EF Core 这样的特定 ORMDB。
我有一个如下所示的数据库架构:
使用 EF Core 迁移,所有 SQL 语句都可以 运行 直到最后一个约束 (FK_BookReleases_Nicknames_NicknameId
)。可以添加之前的FKFK_BookReleases_Books_BookId
我收到的错误是(关于 SO 的许多其他文章):
Introducing FOREIGN KEY constraint 'FK_BookReleases_Nicknames_NicknameId' on table 'BookReleases' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints.
我的问题是,该设计的缺陷在哪里?我无法理解这种情况发生在任何逻辑下。什么是正确的解决方法?我看到许多建议更改 ON DELETE
操作,但没有具体说明我应该使用哪个 FK 以及其他什么操作。
更糟糕的是,即使已经阅读 this article 我仍然不明白这怎么可能是个问题,以及他提出的解决方案如何适合上述模式。
问题是由于从作者(祖父)到 BookRelease(孙子)的多个级联路径。有两个级联路径:
- 作者 -> 书籍 -> BookRelease
- 作者 -> 昵称 -> BookRelease
所以,处理方法是:
禁用 ON DELETE CASCAE 并选择 NOACTION 作为外键创建。
在 Author(GrandParent)、Book(Child1)、Nickname(Child2) 表中创建 INSTEAD OF DELETE TRIGGERS 来处理子表中父键的删除。
- Grand Parent deletion : Delete in GrandChild, followed by Child1, followed by Child2,
- Child1 deletion: Delete in GrandChild, followed by Child1
- Child2 deletion: Delete in GrandChild, followed by Child2