【问题标题】:JOOQ CASCADE DeleteJOOQ CASCADE 删除
【发布时间】:2018-03-29 08:32:40
【问题描述】:

级联删除在数据库级别是不允许的,应该在应用层实现。尝试使用 JOOQ 来实现。目前我的想法如下

给定:扩展 UpdatableRecord 的父记录

  • 使用以下方法获取引用此父主键的外键列表 parentRecord.getTable().getPrimaryKey().getReferences()。
  • 删除child.parentId = parentId的子记录
  • 实现一个递归函数来处理多层次的父子关系。

我在正确的轨道上吗? JOOQ 中是否已经存在此功能?感谢您的任何提示。

【问题讨论】:

  • “级联删除在数据库级别是不允许的,应该在应用层实现” - 为什么?数据库很可能会更好更快地处理这个问题......
  • @LukasEder 这是我们团队负责人的决定,以防止手动使用数据库时发生任何意外损失。应该只允许应用删除表中的数据。

标签: parent-child jooq cascading-deletes


【解决方案1】:

我在正确的轨道上吗?

好吧,对于初学者来说,我真的会坚持为此使用数据库功能。数据库很可能会更好地处理这个问题,而且肯定比从客户端手动滚动它更快。

如果这不是一个选项,另一种方法可能是编写一个实现级联删除的存储过程,以防止可能发生的许多服务器往返。

如果这也不是一个选项,那么是的,您的方法在逻辑上是正确的,但请确保您不会产生an N+1 problem。最有效的解决方案是首先递归地转到叶子子表,在一次批量删除中删除所有相关行(将整个路径半连接到原始表的已删除行),然后递归树。例如:

      A
     / \
    /   \
   B     C
        / \
       /   \
      D     E

如果你想模拟这样的语句(假设语法):

DELETE CASCADE FROM a WHERE a_id IN (1, 2, 3)

然后,你应该运行:

DELETE FROM e WHERE c_id IN (
  SELECT c_id FROM c WHERE a_id IN (1, 2, 3)
);
DELETE FROM e WHERE c_id IN (
  SELECT c_id FROM c WHERE a_id IN (1, 2, 3)
);
DELETE FROM c WHERE a_id IN (1, 2, 3);
DELETE FROM a WHERE a_id IN (1, 2, 3);

jOOQ 肯定会帮助您动态生成这些。

这个功能是否已经存在于 JOOQ 中?

不,但这是一个很好的补充:https://github.com/jOOQ/jOOQ/issues/7367

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-30
    • 2015-08-11
    • 2012-04-15
    • 2020-04-29
    • 2015-02-12
    • 1970-01-01
    相关资源
    最近更新 更多