如何在多对多表上级联删除

Posted

技术标签:

【中文标题】如何在多对多表上级联删除【英文标题】:How to cascade delete over many to many table 【发布时间】:2009-09-04 13:38:15 【问题描述】:

我有 3 个如下所示的表: (来源:InsomniacGeek.com)

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

这是意料之中且正确的。

我要做的是当我删除Folder表中的一条记录时,FolderItem和Item表中对应的记录应该被删除。

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

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

是的,你是对的,有点不正常。我应该澄清想要的行为,这就是你在第二段中解释的内容。【参考方案2】:

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

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

【讨论】:

它已经有了。但这不会级联删除有问题的项目。见hongilangs的回答。 支持“更好的是,代码中有一些业务逻辑”【参考方案3】:

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

【讨论】:

以上是关于如何在多对多表上级联删除的主要内容,如果未能解决你的问题,请参考以下文章

2018.11.4 Hibernate中多对多的关系

具有多对多关系的级联删除[重复]

休眠 - 多对多关系中的级联删除

同一张表之间多对多的级联删除

ACCESS级联删除一对多关系的记录

hibernate 多对多操作(级联操作)