我有 3 个如下所示的表:(
来源:InsomniacGeek.com)
在外键上我设置了级联删除。现在,当我删除 Folder 表中的一条记录时,只会删除 FolderItem 中的相关记录。
这是预期的和正确的。
我要做的是当我删除Folder表中的一条记录时,FolderItem和Item表中的相应记录应该被删除。
我该如何解决这个问题?通过添加一个触发器来删除所有具有相关 FolderID 的 Item 实例?或者有没有更好的解决方案?
我有 3 个如下所示的表:(
来源:InsomniacGeek.com)
在外键上我设置了级联删除。现在,当我删除 Folder 表中的一条记录时,只会删除 FolderItem 中的相关记录。
这是预期的和正确的。
我要做的是当我删除Folder表中的一条记录时,FolderItem和Item表中的相应记录应该被删除。
我该如何解决这个问题?通过添加一个触发器来删除所有具有相关 FolderID 的 Item 实例?或者有没有更好的解决方案?
您需要确定您想要的系统行为。您的要求听起来有点不正常,可能表明数据库架构设计有误。为什么在删除相关文件夹时要删除项目?如果有另一个文件夹仍然与该项目相关,因为它是多对多关系怎么办?在这种情况下,删除 Item 实际上会导致 Item 和 FolderItem 之间的外键冲突。如果项目确实属于特定文件夹,也就是一对多关系,则根本不需要 FolderItem 表。
我想最有可能的情况是,如果没有其他与之相关的 FolderItem 条目,您想删除该项目。在这种情况下,触发器是合适的解决方案,但您需要确保在触发器逻辑中检查它。
您在文件夹项目和项目之间的 FK 也应该打开级联删除。
更新:
我阅读了您的评论和替代答案。完全正确-我无法正确阅读您的问题。假设简单的一对多关系我是对的,但是对于多对多,它并不是那么简单。触发器(或者更好的是,代码中的一些业务逻辑)是实现您想要的最佳选择。
它不能删除 foltitem 记录,因为如果您有 m-to-m 关系,则假定该文件夹项也可以与另一门课程相关。所以,如果你删除文件夹记录,只有关系应该被删除,而不是相关的文件夹项。如果所有文件夹项只能与一个文件夹相关,则应使用一对多的关系,并在文件夹项 fk(文件夹中的 fk -> pk)中设置级联。