如果那个'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);
1 回答
好吧,对于初学者,我真的会坚持使用数据库功能 . 数据库很可能会更好地处理这个问题,并且肯定比从客户端手动滚动它更快 .
如果这不是一个选项,则可以选择编写实现级联删除的存储过程,以防止许多服务器往返,否则可能会发生 .
如果那个's not an option either, then yes, your approach is logically correct, but make sure that you'不会产生an N+1 problem . 最有效的解决方案是首先以递归方式转到叶子表,在单个批量删除中删除所有相关行(将整个路径半连接到原始表的已删除行),然后递归树 . 例如:
如果你想模仿像(假设语法)这样的语句:
然后,你应该运行:
jOOQ肯定会帮助您动态生成这些内容 .
不,但这将是一个很好的补充:https://github.com/jOOQ/jOOQ/issues/7367