首页 文章

JOOQ CASCADE删除

提问于
浏览
1

在数据库级别不允许级联删除,应在应用程序层中实现 . 尝试使用JOOQ实现 . 目前我的想法如下

给定:扩展UpdatableRecord的父记录

  • 使用parentRecord.getTable()获取引用此父级主键的外键列表.getPrimaryKey() . getReferences() .

  • 删除child.parentId = parentId的子记录

  • 实现递归函数来处理多级父子关系 .

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

1 回答

  • 1

    我在正确的轨道上吗?

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

    如果这不是一个选项,则可以选择编写实现级联删除的存储过程,以防止许多服务器往返,否则可能会发生 .

    如果那个's not an option either, then yes, your approach is logically correct, but make sure that you'不会产生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

相关问题