-- ======================================== -- 增强版清理重复菜单SQL脚本 -- 用途:彻底删除数据库中重复的心理学相关菜单 -- 注意:执行前请备份数据库! -- ======================================== USE ry_news; SET NAMES utf8mb4; -- ======================================== -- 第一步:删除重复的父菜单(目录) -- ======================================== -- 删除重复的"心理测评管理"目录(保留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; -- ======================================== -- 第二步:删除基于menu_name和parent_id的重复菜单 -- ======================================== -- 对于相同名称和父菜单的重复项,保留最小的menu_id DELETE t1 FROM sys_menu t1 INNER JOIN sys_menu t2 WHERE t1.menu_name = t2.menu_name AND t1.parent_id = t2.parent_id 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 '%栏目%' OR t1.menu_name LIKE '%评论%' OR t1.menu_name LIKE '%预警%' OR t1.menu_name LIKE '%规则%'); -- ======================================== -- 第三步:删除基于path和component的重复菜单 -- ======================================== -- 删除所有重复菜单(保留menu_id最小的) DELETE t1 FROM sys_menu t1 INNER JOIN sys_menu t2 WHERE t1.path = t2.path AND (t1.component = t2.component OR (t1.component IS NULL AND t2.component IS NULL)) AND t1.menu_name = t2.menu_name AND t1.parent_id = t2.parent_id 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 '%栏目%' OR t1.menu_name LIKE '%评论%' OR t1.menu_name LIKE '%预警%' OR t1.menu_name LIKE '%规则%'); -- ======================================== -- 第四步:清理孤立的子菜单(父菜单已被删除) -- ======================================== -- 删除那些父菜单ID不存在于sys_menu表中的子菜单 DELETE FROM sys_menu WHERE parent_id > 0 AND parent_id NOT IN (SELECT menu_id FROM (SELECT menu_id FROM sys_menu) AS temp) AND (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 '%栏目%' OR menu_name LIKE '%评论%' OR menu_name LIKE '%预警%' OR menu_name LIKE '%规则%'); -- ======================================== -- 第五步:清理角色菜单关联表中的孤立记录 -- ======================================== -- 删除指向已删除菜单的角色菜单关联 DELETE FROM sys_role_menu WHERE menu_id NOT IN (SELECT menu_id FROM (SELECT menu_id FROM sys_menu) AS temp2); -- ======================================== -- 第六步:验证清理结果 -- ======================================== SELECT '清理完成!' AS result; -- 检查是否还有重复菜单 SELECT menu_name AS '菜单名称', path AS '路由路径', component AS '组件路径', parent_id AS '父菜单ID', COUNT(*) AS '剩余数量' 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 '%栏目%' OR menu_name LIKE '%评论%' OR menu_name LIKE '%预警%' OR menu_name LIKE '%规则%' GROUP BY menu_name, path, component, parent_id HAVING COUNT(*) > 1; -- 如果没有输出,说明没有重复菜单了 SELECT '如果上面的查询没有返回结果,说明所有重复菜单已清理完成!' AS message;