如何级联/删除此方案?获得多个级联错误

时间:2018-02-13 05:28:53

标签: sql sql-server database relational-database

请看下面的图表: Diagram

如果用户被删除,这一切都与有关。

1.如果用户被删除,并且用户有一个帖子。该线程将被删除。
2.如果用户没有帖子但有帖子,则会删除帖子。
3.如果删除了某个线程,则删除该线程上的所有帖子。

我尝试级联User-> Thread,User-> Post,Thread-> Post。但是,我得到了这个例外:Introducing FOREIGN KEY constraint may cause cycles or multiple cascade paths. Specify on delete no action.

我理解错误。如果用户被删除,则删除线程和帖子,因此当删除线程时,它将尝试级联帖子,该帖子已经被用户级联。 (这是对的吗?)

如果以上情况属实,我该如何解决?

2 个答案:

答案 0 :(得分:1)

有一个替代解决方案,你必须在删除PK时将FK设置为​​null,如下所示。在关系中,有一组Table Designer,其中Insert and Update specification选项可以找到它Delete Rule,将其设置为NULL。

这意味着在您的方案中,在线程表中删除用户时user_account_id列值替换为NULL,并且在post table user_account_id列值中替换为NULL。当您删除任何线程时,它也会影响帖子表和列user_account_id值将替换为NULL

enter image description here

答案 1 :(得分:1)

<强>修

所以从下面的讨论中听起来像是: 当用户被删除时,您想要删除他的主题以及与该主题相关联的任何帖子(他或其他任何人的帖子),以及可能在其他人的帖子中的任何帖子。通过设计,这为我们提供了2个删除帖子表中的行的路径,因此,问题。

只需用Google搜索并在一个名为stackoverflow的模糊网站上找到对此确切问题的深入讨论: - )

Introducing FOREIGN KEY constraint may cause cycles or multiple cascade paths - why?

上述讨论既深入又广泛,值得一读。这不会公平,但在下面被LuFFy推动之后,我决定添加一些亮点。 1号答案的主旨基本上就是我上面已经说过的 - 有两个级联删除路径到同一个表。

一种解决方案是:不要这样做,关闭邮政表上其中一个FK的删除规则。另一种解决方案是将Sandip Patel在其他响应中将删除规则之一设置为“设置为空”(如更详细的描述)。

我希望这会有所帮助。