【问题标题】:How can these constraints may cause cycles or multiple cascade paths?这些约束如何可能导致循环或多个级联路径?
【发布时间】:2020-07-25 10:46:58
【问题描述】:

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

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

使用 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,我仍然不明白这怎么可能是一个问题,以及他提出的解决方案如何适合上述架构。

【问题讨论】:

  • 在这里查看答案:stackoverflow.com/questions/851625/… 设计确实没有问题,这是一个实现限制。
  • @GeorgeBarwood 对不起,也许夜班让我心烦意乱。我实际上在我的问题中引用了这个答案,问题是,我无法理解他的解决方法是如何工作的。即在上述情况下,我的桌子应该是什么样子?或者我应该改变什么 FK Action?
  • 我想我会在 Author-Nickname FK 关系上设置 No Action,假设 Nickname 永远不会被删除,或者如果 Author 被删除,则必须先删除所有昵称。
  • 请通过编辑而非 cmets 进行澄清。将提问所需的内容直接放入其中。如果您想询问对演示文稿的理解,请明确说明并引用需要解释的内容来解释您是如何被卡住的。或评论该帖子以进行澄清。请use text, not images/links, for text--including tables & ERDs。仅将图像用于无法表达为文本或增强文本的内容。在图像中包含图例/键和说明。代码问题请给minimal reproducible example
  • “可能导致循环或多级联路径”阅读手册——不允许多路径。找出“路径”的含义。遵循来自 Author 的级联路径 - AuthorRelease 有两个。你是如何陷入这个过程的?或者,如果您无法按照您的评论遵循解决方案,那么您的问题实际上并不是您的帖子所说的,因此请编辑您的帖子以提出您想问的 1 个问题。

标签: sql sql-server foreign-keys cascade


【解决方案1】:

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

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

这在post in MSSQLTips中有详细讨论

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-19
    • 2010-10-25
    • 2015-05-22
    • 2012-09-21
    相关资源
    最近更新 更多