guoyu/log/数据库/clean_orphan_user_data.sql

118 lines
3.8 KiB
MySQL
Raw Normal View History

2025-12-11 23:28:07 +08:00
-- ====================================
-- 清理孤儿用户数据脚本
-- 功能删除那些引用了不存在的用户ID的数据
-- 使用场景当删除sys_user后清理关联表中的残留数据
-- ====================================
-- 1. 查看孤儿数据统计(执行清理前先查看)
-- ====================================
-- 1.1 查看班级学生关联表中的孤儿数据
SELECT '班级学生关联表(study_student_class)孤儿数据' AS , COUNT(*) AS
FROM study_student_class ssc
WHERE NOT EXISTS (
SELECT 1 FROM sys_user u WHERE u.user_id = ssc.user_id
);
-- 1.2 查看学习记录表中的孤儿数据
SELECT '学习记录表(study_learning_record)孤儿数据' AS , COUNT(*) AS
FROM study_learning_record slr
WHERE NOT EXISTS (
SELECT 1 FROM sys_user u WHERE u.user_id = slr.student_id
);
-- 1.3 查看学习明细表中的孤儿数据
SELECT '学习明细表(study_learning_detail)孤儿数据' AS , COUNT(*) AS
FROM study_learning_detail sld
WHERE NOT EXISTS (
SELECT 1 FROM sys_user u WHERE u.user_id = sld.student_id
);
-- 1.4 查看语音评测表中的孤儿数据
SELECT '语音评测表(study_voice_score)孤儿数据' AS , COUNT(*) AS
FROM study_voice_score svs
WHERE svs.student_id IS NOT NULL
AND NOT EXISTS (
SELECT 1 FROM sys_user u WHERE u.user_id = svs.student_id
);
-- ====================================
-- 2. 执行清理(请先执行上面的查询确认后再执行清理)
-- ====================================
-- 2.1 清理班级学生关联表
DELETE FROM study_student_class
WHERE NOT EXISTS (
SELECT 1 FROM sys_user u WHERE u.user_id = study_student_class.user_id
);
-- 2.2 清理学习记录表
DELETE FROM study_learning_record
WHERE NOT EXISTS (
SELECT 1 FROM sys_user u WHERE u.user_id = study_learning_record.student_id
);
-- 2.3 清理学习明细表
DELETE FROM study_learning_detail
WHERE NOT EXISTS (
SELECT 1 FROM sys_user u WHERE u.user_id = study_learning_detail.student_id
);
-- 2.4 清理语音评测表
DELETE FROM study_voice_score
WHERE student_id IS NOT NULL
AND NOT EXISTS (
SELECT 1 FROM sys_user u WHERE u.user_id = study_voice_score.student_id
);
-- ====================================
-- 3. 验证清理结果
-- ====================================
-- 3.1 再次统计孤儿数据应该为0
SELECT '班级学生关联表' AS , COUNT(*) AS
FROM study_student_class ssc
WHERE NOT EXISTS (SELECT 1 FROM sys_user u WHERE u.user_id = ssc.user_id)
UNION ALL
SELECT '学习记录表', COUNT(*)
FROM study_learning_record slr
WHERE NOT EXISTS (SELECT 1 FROM sys_user u WHERE u.user_id = slr.student_id)
UNION ALL
SELECT '学习明细表', COUNT(*)
FROM study_learning_detail sld
WHERE NOT EXISTS (SELECT 1 FROM sys_user u WHERE u.user_id = sld.student_id)
UNION ALL
SELECT '语音评测表', COUNT(*)
FROM study_voice_score svs
WHERE svs.student_id IS NOT NULL
AND NOT EXISTS (SELECT 1 FROM sys_user u WHERE u.user_id = svs.student_id);
-- 3.2 查看当前有效用户统计
SELECT
'总用户数' AS ,
COUNT(*) AS
FROM sys_user
WHERE user_id != 1 -- 排除管理员
UNION ALL
SELECT
'学生数按userName数字开头',
COUNT(*)
FROM sys_user
WHERE user_name REGEXP '^[0-9]' AND user_id != 1
UNION ALL
SELECT
'班级关联学生数',
COUNT(DISTINCT user_id)
FROM study_student_class;
-- ====================================
-- 使用说明:
-- 1. 先执行第1部分查看有多少孤儿数据
-- 2. 确认无误后执行第2部分进行清理
-- 3. 最后执行第3部分验证清理结果
--
-- 注意事项:
-- - 本脚本会永久删除数据,执行前请备份数据库!
-- - 建议在测试环境先验证
-- ====================================