xinli/删除姓名为数字的用户SQL脚本_修正版.sql

288 lines
9.0 KiB
MySQL
Raw Normal View History

2025-12-02 15:12:55 +08:00
-- ========================================
-- 删除姓名为纯数字的用户数据 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 = '某监区'; -- 替换为实际的监区名称
*/