-- ======================================== -- 删除姓名为纯数字的用户数据 SQL脚本(修正版) -- 创建时间: 2025-12-01 -- 警告: 执行前请务必备份数据库! -- 说明: user_name字段在sys_user表中,不在psy_user_profile表中 -- ======================================== -- ======================================== -- 第一步: 查询姓名为纯数字的用户(先确认数量) -- ======================================== -- 1. 查看姓名为纯数字的用户档案数量 SELECT COUNT(*) AS '姓名为纯数字的用户数', MIN(p.create_time) AS '最早创建时间', MAX(p.create_time) AS '最晚创建时间' FROM psy_user_profile p INNER JOIN sys_user u ON p.user_id = u.user_id WHERE u.user_name REGEXP '^[0-9]+$'; -- 2. 查看姓名为纯数字的用户档案详情(检查是否是要删除的数据) SELECT p.profile_id, p.user_id, p.info_number, u.user_name, p.prison_area, p.create_time, p.create_by FROM psy_user_profile p INNER JOIN sys_user u ON p.user_id = u.user_id WHERE u.user_name REGEXP '^[0-9]+$' ORDER BY p.create_time DESC LIMIT 20; -- 3. 查看这些用户在sys_user表中的对应记录 SELECT u.user_id, u.user_name, u.nick_name, u.create_time, p.info_number FROM sys_user u INNER JOIN psy_user_profile p ON u.user_id = p.user_id WHERE u.user_name REGEXP '^[0-9]+$' AND u.user_id > 1; -- 排除管理员账户 -- ======================================== -- 第二步: 数据备份(强烈推荐!) -- ======================================== -- 创建备份表 CREATE TABLE IF NOT EXISTS psy_user_profile_backup_numeric_names AS SELECT p.* FROM psy_user_profile p INNER JOIN sys_user u ON p.user_id = u.user_id WHERE u.user_name REGEXP '^[0-9]+$'; CREATE TABLE IF NOT EXISTS sys_user_backup_numeric_names AS SELECT u.* FROM sys_user u INNER JOIN psy_user_profile p ON u.user_id = p.user_id WHERE u.user_name REGEXP '^[0-9]+$' AND u.user_id > 1; -- 验证备份 SELECT COUNT(*) AS '备份的用户档案数' FROM psy_user_profile_backup_numeric_names; SELECT COUNT(*) AS '备份的系统用户数' FROM sys_user_backup_numeric_names; -- 查看备份的具体数据 SELECT profile_id, user_id, info_number FROM psy_user_profile_backup_numeric_names LIMIT 10; SELECT user_id, user_name, nick_name FROM sys_user_backup_numeric_names LIMIT 10; -- ======================================== -- 第三步: 删除关联数据(外键关联) -- ======================================== -- 3.1 删除测评答题详情 DELETE FROM psy_assessment_answer WHERE assessment_id IN ( SELECT a.assessment_id FROM psy_assessment a INNER JOIN psy_user_profile p ON a.target_user_id = p.user_id INNER JOIN sys_user u ON p.user_id = u.user_id WHERE u.user_name REGEXP '^[0-9]+$' ); -- 3.2 删除因子得分 DELETE FROM psy_factor_score WHERE assessment_id IN ( SELECT a.assessment_id FROM psy_assessment a INNER JOIN psy_user_profile p ON a.target_user_id = p.user_id INNER JOIN sys_user u ON p.user_id = u.user_id WHERE u.user_name REGEXP '^[0-9]+$' ); -- 3.3 删除测评预警 DELETE FROM psy_assessment_warning WHERE assessment_id IN ( SELECT a.assessment_id FROM psy_assessment a INNER JOIN psy_user_profile p ON a.target_user_id = p.user_id INNER JOIN sys_user u ON p.user_id = u.user_id WHERE u.user_name REGEXP '^[0-9]+$' ); -- 3.4 删除测评报告 DELETE FROM psy_assessment_report WHERE assessment_id IN ( SELECT a.assessment_id FROM psy_assessment a INNER JOIN psy_user_profile p ON a.target_user_id = p.user_id INNER JOIN sys_user u ON p.user_id = u.user_id WHERE u.user_name REGEXP '^[0-9]+$' ); -- 3.5 删除测评记录 DELETE FROM psy_assessment WHERE target_user_id IN ( SELECT p.user_id FROM psy_user_profile p INNER JOIN sys_user u ON p.user_id = u.user_id WHERE u.user_name REGEXP '^[0-9]+$' ); -- 3.6 删除量表权限 DELETE FROM psy_scale_permission WHERE user_id IN ( SELECT p.user_id FROM psy_user_profile p INNER JOIN sys_user u ON p.user_id = u.user_id WHERE u.user_name REGEXP '^[0-9]+$' ); -- 3.7 删除问卷答题详情 DELETE FROM psy_questionnaire_answer_detail WHERE answer_id IN ( SELECT qa.answer_id FROM psy_questionnaire_answer qa INNER JOIN psy_user_profile p ON qa.user_id = p.user_id INNER JOIN sys_user u ON p.user_id = u.user_id WHERE u.user_name REGEXP '^[0-9]+$' ); -- 3.8 删除问卷答题记录 DELETE FROM psy_questionnaire_answer WHERE user_id IN ( SELECT p.user_id FROM psy_user_profile p INNER JOIN sys_user u ON p.user_id = u.user_id WHERE u.user_name REGEXP '^[0-9]+$' ); -- 3.9 删除用户角色关联 DELETE FROM sys_user_role WHERE user_id IN ( SELECT p.user_id FROM psy_user_profile p INNER JOIN sys_user u ON p.user_id = u.user_id WHERE u.user_name REGEXP '^[0-9]+$' ); -- 3.10 删除用户岗位关联 DELETE FROM sys_user_post WHERE user_id IN ( SELECT p.user_id FROM psy_user_profile p INNER JOIN sys_user u ON p.user_id = u.user_id WHERE u.user_name REGEXP '^[0-9]+$' ); -- ======================================== -- 第四步: 删除用户档案和系统用户 -- ======================================== -- 4.1 删除用户档案 DELETE FROM psy_user_profile WHERE user_id IN ( SELECT user_id FROM sys_user_backup_numeric_names ); -- 4.2 删除系统用户(使用备份表中的user_id) DELETE FROM sys_user WHERE user_id IN ( SELECT user_id FROM sys_user_backup_numeric_names ) AND user_id > 1; -- 保护管理员账户 -- ======================================== -- 第五步: 验证删除结果 -- ======================================== -- 验证姓名为纯数字的用户是否已删除 SELECT COUNT(*) AS '剩余姓名为数字的用户档案数' FROM psy_user_profile p INNER JOIN sys_user u ON p.user_id = u.user_id WHERE u.user_name REGEXP '^[0-9]+$'; SELECT COUNT(*) AS '剩余姓名为数字的系统用户数' FROM sys_user WHERE user_name REGEXP '^[0-9]+$' AND user_id > 1; -- 查看备份表中的数据(确认备份成功) SELECT COUNT(*) AS '备份的档案记录数' FROM psy_user_profile_backup_numeric_names; SELECT COUNT(*) AS '备份的系统用户记录数' FROM sys_user_backup_numeric_names; -- 查看备份的示例数据 SELECT * FROM psy_user_profile_backup_numeric_names LIMIT 5; SELECT * FROM sys_user_backup_numeric_names LIMIT 5; -- ======================================== -- 恢复数据脚本(如果需要回滚) -- ======================================== /* -- 恢复用户档案 INSERT INTO psy_user_profile SELECT * FROM psy_user_profile_backup_numeric_names; -- 恢复系统用户 INSERT INTO sys_user SELECT * FROM sys_user_backup_numeric_names; -- 注意:恢复后需要手动恢复关联数据,建议在删除前做完整数据库备份! */ -- ======================================== -- 清理备份表(确认数据无误后可执行) -- ======================================== /* DROP TABLE IF EXISTS psy_user_profile_backup_numeric_names; DROP TABLE IF EXISTS sys_user_backup_numeric_names; */ -- ======================================== -- 执行说明 -- ======================================== /* 执行顺序: 1. 先执行"第一步"的查询,确认是否是要删除的数据(检查姓名字段) 2. 执行"第二步"创建备份(必须!) 3. 验证备份数据 4. 执行"第三步"删除关联数据(一条一条执行,观察影响行数) 5. 执行"第四步"删除主表数据 6. 执行"第五步"验证删除结果 7. 如果出错,使用恢复脚本回滚 重要发现: - user_name 字段在 sys_user 表中,不在 psy_user_profile 表中 - 需要通过 INNER JOIN 关联两个表进行查询 - psy_user_profile.user_id = sys_user.user_id 注意事项: 1. 务必在测试环境先执行一遍 2. 生产环境执行前做完整数据库备份 3. 建议在业务低峰期执行 4. 执行前通知相关人员 5. 保留备份表至少7天 6. 正则表达式 '^[0-9]+$' 匹配纯数字(只包含0-9的字符串) 7. 如果有其他关联表,需要补充删除语句 判断规则: - '^[0-9]+$' 表示从开头到结尾都是数字 - 例如:'123'、'456' 会被匹配 - 例如:'张三'、'123abc'、'李4' 不会被匹配 */ -- ======================================== -- 更精确的匹配方案(可选) -- ======================================== /* -- 方案A:只删除纯数字且长度在特定范围的姓名 -- 例如:只删除3-10位纯数字的姓名 SELECT COUNT(*) FROM sys_user u INNER JOIN psy_user_profile p ON u.user_id = p.user_id WHERE u.user_name REGEXP '^[0-9]{3,10}$'; -- 方案B:排除某些特定的数字姓名(如果有合法的数字姓名) SELECT COUNT(*) FROM sys_user u INNER JOIN psy_user_profile p ON u.user_id = p.user_id WHERE u.user_name REGEXP '^[0-9]+$' AND u.user_name NOT IN ('001', '002'); -- 排除这些合法的数字姓名 -- 方案C:只删除特定区域的数字姓名用户 SELECT COUNT(*) FROM sys_user u INNER JOIN psy_user_profile p ON u.user_id = p.user_id WHERE u.user_name REGEXP '^[0-9]+$' AND p.prison_area = '某监区'; -- 替换为实际的监区名称 */