MySQL递归UPDATE多分支场景下,如何为行设置对应顶级MenuID?
解决方案
可以通过修改递归CTE的结构,在其中保留每个菜单节点对应的顶级MenuID,再基于这个关联关系执行UPDATE,用单条语句实现需求。
修改后的UPDATE语句
UPDATE Menues JOIN ( WITH RECURSIVE CTE (MenuID, TopMenuID) AS ( -- 锚点:选中所有顶级MenuID,TopMenuID设为自身 SELECT T.MenuID, T.MenuID AS TopMenuID FROM Menues AS T WHERE T.MenuID IN (" + pid + ") UNION ALL -- 递归:传递顶级MenuID给子节点 SELECT T.MenuID, CTE.TopMenuID FROM Menues AS T INNER JOIN CTE ON CTE.MenuID = T.ParentID ) SELECT MenuID, TopMenuID FROM CTE ) AS RecursiveMenus ON Menues.MenuID = RecursiveMenus.MenuID SET Menues.DeletedBy = RecursiveMenus.TopMenuID;
原理说明
- 递归CTE扩展:新增
TopMenuID字段,在锚点查询中直接将顶级菜单的ID赋值给该字段;递归过程中,始终传递父节点的TopMenuID,确保每个子节点都能关联到自己所属的顶级分支ID。 - 关联更新:通过
Menues.MenuID与CTE的MenuID关联,将每个节点的DeletedBy字段设置为对应的TopMenuID,实现分支对应的顶级ID精准赋值。
这样就不需要循环遍历每个pid执行多次UPDATE,单条语句即可完成所有分支的批量更新。
内容的提问来源于stack exchange,提问作者Jralford
相关产品推荐
相关产品推荐

