288 lines
9.0 KiB
SQL
288 lines
9.0 KiB
SQL
-- ========================================
|
||
-- 删除姓名为纯数字的用户数据 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 = '某监区'; -- 替换为实际的监区名称
|
||
*/
|