xinli/删除姓名为数字的用户SQL脚本.sql
2025-12-02 15:12:55 +08:00

263 lines
7.8 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脚本
-- 创建时间: 2025-12-01
-- 警告: 执行前请务必备份数据库!
-- ========================================
-- ========================================
-- 第一步: 查询姓名为纯数字的用户(先确认数量)
-- ========================================
-- 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
profile_id,
user_id,
info_number,
user_name,
prison_area,
create_time,
create_by
FROM psy_user_profile
WHERE user_name REGEXP '^[0-9]+$'
ORDER BY create_time DESC
LIMIT 20;
-- 3. 查看这些用户在sys_user表中的对应记录
SELECT
u.user_id,
u.user_name,
u.nick_name,
u.create_time
FROM sys_user u
INNER JOIN psy_user_profile p ON u.user_id = p.user_id
WHERE p.user_name REGEXP '^[0-9]+$'
AND u.user_id > 1; -- 排除管理员账户
-- ========================================
-- 第二步: 数据备份(强烈推荐!)
-- ========================================
-- 创建备份表
CREATE TABLE IF NOT EXISTS psy_user_profile_backup_numeric_names AS
SELECT * FROM psy_user_profile
WHERE 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 p.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, user_name, info_number FROM psy_user_profile_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
WHERE p.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
WHERE p.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
WHERE p.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
WHERE p.user_name REGEXP '^[0-9]+$'
);
-- 3.5 删除测评记录
DELETE FROM psy_assessment
WHERE target_user_id IN (
SELECT user_id FROM psy_user_profile
WHERE user_name REGEXP '^[0-9]+$'
);
-- 3.6 删除量表权限
DELETE FROM psy_scale_permission
WHERE user_id IN (
SELECT user_id FROM psy_user_profile
WHERE 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
WHERE p.user_name REGEXP '^[0-9]+$'
);
-- 3.8 删除问卷答题记录
DELETE FROM psy_questionnaire_answer
WHERE user_id IN (
SELECT user_id FROM psy_user_profile
WHERE user_name REGEXP '^[0-9]+$'
);
-- 3.9 删除用户角色关联
DELETE FROM sys_user_role
WHERE user_id IN (
SELECT user_id FROM psy_user_profile
WHERE user_name REGEXP '^[0-9]+$'
);
-- 3.10 删除用户岗位关联
DELETE FROM sys_user_post
WHERE user_id IN (
SELECT user_id FROM psy_user_profile
WHERE user_name REGEXP '^[0-9]+$'
);
-- ========================================
-- 第四步: 删除用户档案和系统用户
-- ========================================
-- 4.1 删除用户档案
DELETE FROM psy_user_profile
WHERE user_name REGEXP '^[0-9]+$';
-- 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
WHERE user_name REGEXP '^[0-9]+$';
SELECT COUNT(*) AS '剩余姓名为数字的系统用户数'
FROM sys_user u
INNER JOIN psy_user_profile p ON u.user_id = p.user_id
WHERE p.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 * 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. 如果出错,使用恢复脚本回滚
注意事项:
1. 务必在测试环境先执行一遍
2. 生产环境执行前做完整数据库备份
3. 建议在业务低峰期执行
4. 执行前通知相关人员
5. 保留备份表至少7天
6. 正则表达式 '^[0-9]+$' 匹配纯数字只包含0-9的字符串
7. 如果有其他关联表,需要补充删除语句
判断规则:
- '^[0-9]+$' 表示从开头到结尾都是数字
- 例如:'123'、'456' 会被匹配
- 例如:'张三'、'123abc'、'李4' 不会被匹配
*/
-- ========================================
-- 更精确的匹配方案(可选)
-- ========================================
/*
-- 方案A只删除纯数字且长度在特定范围的姓名
-- 例如只删除3-10位纯数字的姓名
SELECT COUNT(*) FROM psy_user_profile
WHERE user_name REGEXP '^[0-9]{3,10}$';
-- 方案B排除某些特定的数字姓名如果有合法的数字姓名
SELECT COUNT(*) FROM psy_user_profile
WHERE user_name REGEXP '^[0-9]+$'
AND user_name NOT IN ('001', '002'); -- 排除这些合法的数字姓名
-- 方案C只删除特定区域的数字姓名用户
SELECT COUNT(*) FROM psy_user_profile
WHERE user_name REGEXP '^[0-9]+$'
AND prison_area = '某监区'; -- 替换为实际的监区名称
*/