如何级联删除多对多表

时间:2009-09-04 13:38:15

标签: sql-server cascading-deletes

我有3个表格如下:
(来源:InsomniacGeek.com

在外键上我设置了级联删除。 现在,当我删除Folder表中的记录时,只删除FolderItem中的相关记录。

这是预期和正确的。

我要完成的是当我删除Folder表中的记录时,应该删除FolderItem和Item表中的相应记录。

我该如何解决这个问题? 通过添加一个触发器来删除有问题的FolderID的所有Item实例? 或者有更好的解决方案吗?

3 个答案:

答案 0 :(得分:11)

您需要确定您希望系统完全符合您的行为。您的要求听起来有点异常,可能表明db模式设计中存在错误。为什么要在删除相关文件夹时删除项目?如果有另一个文件夹仍然与该项目相关,那该怎么办?因为它是多对多的关系?在这种情况下,删除Item实际上会导致Item和FolderItem之间的外键冲突。如果Items实际上属于特定文件夹,即一对多关系,则根本不需要FolderItem表。

我想最有可能的情况是,如果没有与之相关的其他FolderItem条目,则要删除该项。在这种情况下,触发器是适当的解决方案,但您需要确保在触发器逻辑中检查它。

答案 1 :(得分:1)

文件夹项目和项目之间的FK也应该打开级联删除。

更新:
我读了你的评论和另一个答案。绝对正确 - 我无法正确阅读你的问题。假设简单的一对多关系我是对的,但是有许多关系并不是那么简单。触发器(或者更好的是代码中的某些业务逻辑)是实现您想要的最佳选择。

答案 2 :(得分:-1)

它不能删除folteritem记录,因为如果你有m-to-m关系,那么它认为folderitem也可能与另一个课程相关。所以,如果你删除文件夹记录,只应该删除关系,而不是相关的文件夹。如果所有文件夹项目只能与一个文件夹相关,则应使用一对多关系并在folderitem fk中设置级联(文件夹中的fk - > pk)。