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