sql - 这些约束如何可能导致循环或多个级联路径?
问题描述
注意:这个问题更多的是关于数据库设计和 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 和其他操作。
更糟糕的是,即使已经阅读了这篇文章,我仍然不明白这怎么可能是一个问题,以及他提出的解决方案如何适合上述模式。
解决方案
问题是由于从作者(祖父)到 BookRelease(孙子)的多个级联路径。有两条级联路径:
- 作者 -> 图书 -> BookRelease
- 作者 -> 昵称 -> BookRelease
这在 MSSQLTips中的帖子中有详细讨论
所以,处理这个问题的方法是:
禁用 ON DELETE CASCAE 并选择 NOACTION 作为外键创建。
在 Author(GrandParent)、Book(Child1)、Nickname(Child2) 表中创建 INSTEAD OF DELETE TRIGGERS 来处理子表中父键的删除。
- Grand Parent 删除:在 GrandChild 中删除,然后是 Child1,然后是 Child2,
- Child1删除:在GrandChild中删除,后跟Child1
- Child2删除:在GrandChild中删除,后跟Child2
推荐阅读
- javascript - 为什么我从我的 Express 服务器收到“404 无法 POST”错误?
- reactjs - Mern,删除评论问题
- mapbox - 使用 Mapbox-sdk v8.6.1 在 Android 中将标记设置为当前位置
- javascript - 如何将 javascript 外部文件(如 bootstrap、jQuery)添加到 reactjs 应用程序
- javascript - 如何一次检查所有表是否为空?
- javascript - JavaScript:承诺回调执行
- css - 将单位添加到计算
- r - 如何在 R 中加载多个“.RData”并将它们组合为 mcmc 列表?
- python - 使用带有单元格边框的 2.color_scale 导出 excel
- mysql - 考虑到高性能,使用 sql 获得所需的输出?