You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;

原理说明

  1. 递归CTE扩展:新增TopMenuID字段,在锚点查询中直接将顶级菜单的ID赋值给该字段;递归过程中,始终传递父节点的TopMenuID,确保每个子节点都能关联到自己所属的顶级分支ID。
  2. 关联更新:通过Menues.MenuID与CTE的MenuID关联,将每个节点的DeletedBy字段设置为对应的TopMenuID,实现分支对应的顶级ID精准赋值。

这样就不需要循环遍历每个pid执行多次UPDATE,单条语句即可完成所有分支的批量更新。

内容的提问来源于stack exchange,提问作者Jralford

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 08:07:35