如何根据RightName字段更新Rights表的ParentRightId字段?
解决Rights表中ParentRightId的批量更新问题
你的原语句无法生效的核心原因是关联逻辑错误:你用当前权限RightName的最后一段(如CONFIGURATOR)去匹配其他权限RightName的第一段(如CAROUSEL),这完全不符合父权限的命名规则——父权限的RightName是子权限RightName去掉最后一个_xxx后缀的完整字符串。
正确的更新语句
UPDATE Rights AS r1 LEFT JOIN Rights AS r2 ON r2.RightName = SUBSTRING_INDEX(r1.RightName, '_', LENGTH(r1.RightName) - LENGTH(REPLACE(r1.RightName, '_', ''))) SET r1.ParentRightId = r2.rightId WHERE LENGTH(r1.RightName) - LENGTH(REPLACE(r1.RightName, '_', '')) > 0;
语句说明
- 筛选有父节点的权限:
LENGTH(r1.RightName) - LENGTH(REPLACE(r1.RightName, '_', ''))统计当前RightName中的下划线总数,仅处理下划线数>0的权限(根节点无父节点,保持ParentRightId为NULL)。 - 提取父权限完整名称:
SUBSTRING_INDEX(r1.RightName, '_', 下划线数量)会截断当前RightName的最后一个下划线及后续内容,得到父权限的完整RightName。 - 关联并更新:通过
LEFT JOIN匹配到对应的父权限记录,将其rightId赋值给当前权限的ParentRightId。
示例数据验证
执行上述语句后,你的示例数据会被更新为:
| rightId | RightName | ParentRightId |
|---|---|---|
| 1 | CAROUSEL MENU | NULL |
| 2 | CAROUSEL MENU_SALES | 1 |
| 3 | CAROUSEL MENU_SALES_CONFIGURATOR | 2 |
完全符合层级关系的预期。
内容的提问来源于stack exchange,提问作者kixrogu
相关产品推荐
相关产品推荐

