xinli/sql/cleanup_duplicate_menus.sql
2025-11-06 14:59:32 +08:00

100 lines
3.4 KiB
SQL
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

-- ========================================
-- 清理重复菜单SQL脚本
-- 用途:删除数据库中重复的心理学相关菜单
-- ========================================
USE ry_news;
SET NAMES utf8mb4;
-- ========================================
-- 1. 查找重复的菜单基于menu_name和path组合
-- ========================================
-- 先查看重复的菜单
SELECT menu_name, path, component, COUNT(*) as count
FROM sys_menu
WHERE menu_name LIKE '%心理%'
OR menu_name LIKE '%量表%'
OR menu_name LIKE '%题目%'
OR menu_name LIKE '%因子%'
OR menu_name LIKE '%测评%'
OR menu_name LIKE '%网站%'
OR menu_name LIKE '%栏目%'
OR menu_name LIKE '%评论%'
OR menu_name LIKE '%预警%'
OR menu_name LIKE '%问卷%'
OR menu_name LIKE '%档案%'
GROUP BY menu_name, path, component
HAVING count > 1;
-- ========================================
-- 2. 删除重复的菜单保留menu_id最小的那个
-- ========================================
-- 删除"心理测评管理"目录的重复项(保留第一个)
DELETE t1 FROM sys_menu t1
INNER JOIN sys_menu t2
WHERE t1.menu_name = '心理测评管理'
AND t1.parent_id = 0
AND t2.menu_name = '心理测评管理'
AND t2.parent_id = 0
AND t1.menu_id > t2.menu_id;
-- 删除"心理网站管理"目录的重复项
DELETE t1 FROM sys_menu t1
INNER JOIN sys_menu t2
WHERE t1.menu_name = '心理网站管理'
AND t1.parent_id = 0
AND t2.menu_name = '心理网站管理'
AND t2.parent_id = 0
AND t1.menu_id > t2.menu_id;
-- 删除其他重复菜单基于path和component
DELETE t1 FROM sys_menu t1
INNER JOIN sys_menu t2
WHERE t1.path = t2.path
AND t1.component = t2.component
AND t1.menu_name = t2.menu_name
AND t1.menu_id > t2.menu_id
AND (t1.menu_name LIKE '%心理%'
OR t1.menu_name LIKE '%量表%'
OR t1.menu_name LIKE '%题目%'
OR t1.menu_name LIKE '%因子%'
OR t1.menu_name LIKE '%测评%'
OR t1.menu_name LIKE '%网站%'
OR t1.menu_name LIKE '%栏目%'
OR t1.menu_name LIKE '%评论%'
OR t1.menu_name LIKE '%预警%'
OR t1.menu_name LIKE '%问卷%'
OR t1.menu_name LIKE '%档案%');
-- ========================================
-- 3. 清理孤立的菜单parent_id指向已删除的菜单
-- ========================================
-- 先删除父菜单被删除但子菜单还存在的情况应该先执行步骤2再执行这一步
-- 注意这一步需要确保先执行步骤2否则可能会误删
-- 暂时注释掉因为MySQL不允许在同一个表中删除和查询
-- 如果需要清理孤立菜单,建议手动检查:
-- SELECT * FROM sys_menu WHERE parent_id NOT IN (SELECT menu_id FROM sys_menu)
-- AND menu_name LIKE '%心理%';
-- ========================================
-- 4. 验证清理结果
-- ========================================
SELECT '清理完成!当前心理学相关菜单数量:' AS result;
SELECT menu_name, path, component, COUNT(*) as count
FROM sys_menu
WHERE menu_name LIKE '%心理%'
OR menu_name LIKE '%量表%'
OR menu_name LIKE '%题目%'
OR menu_name LIKE '%因子%'
OR menu_name LIKE '%测评%'
OR menu_name LIKE '%网站%'
OR menu_name LIKE '%栏目%'
OR menu_name LIKE '%评论%'
OR menu_name LIKE '%预警%'
OR menu_name LIKE '%问卷%'
OR menu_name LIKE '%档案%'
GROUP BY menu_name, path, component
HAVING count > 1;
-- 如果没有输出,说明没有重复菜单了