注意:这个问题更多的是关于数据库设计和SQL Server,而不是像EF Core这样的特定ORMDB。
我有一个看起来像这样的数据库模式:
使用EF Core迁移,所有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,我仍然不明白这可能是个问题,他提出的解决方案如何适合上述方案。
该问题是由于从作者(祖父母)到BookRelease(孙子女)的多个级联路径。有两种级联路径:
将在post in MSSQLTips中详细讨论
因此,处理此问题的方法是:
禁用ON DELETE CASCAE并选择NOACTION作为外键创建。
在Author(GrandParent),Book(Child1),Nickname(Child2)表中创建INSTEAD OF DELETE TRIGGERS,以处理子表中父键的删除。
- Grand Parent delete:在GrandChild中删除,然后是Child1,其次是Child2,
- Child1删除:在GrandChild中删除,然后由Child1
- Child2删除:在GrandChild中删除,然后在Child2中进行删除>