代码之家  ›  专栏  ›  技术社区  ›  Magnus Johansson

如何级联删除多对多表

  •  12
  • Magnus Johansson  · 技术社区  · 15 年前

    我有三张这样的桌子:

    在外键上,我设置了级联删除。 现在,删除文件夹表中的记录时,只删除文件夹项中的相关记录。

    这是期望和正确的。

    我要完成的是,当我删除文件夹表中的记录时,应删除文件夹项和项目表中的相应记录。

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

    3 回复  |  直到 7 年前
        1
  •  11
  •   hongliang    15 年前

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

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

        2
  •  1
  •   Neil Barnwell    15 年前

    文件夹项和项之间的FK也应该启用级联删除。

    更新:
    我读了你的评论和备选答案。完全正确-我不能正确地阅读你的问题。假设简单的一对多的关系,我是对的,但有很多关系就不那么简单了。触发器(或者更好的是,代码中的一些业务逻辑)是实现所需目标的最佳选择。

        3
  •  -1
  •   Arlindo Neto    7 年前

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