118 lines
3.8 KiB
SQL
118 lines
3.8 KiB
SQL
-- ====================================
|
||
-- 清理孤儿用户数据脚本
|
||
-- 功能:删除那些引用了不存在的用户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部分,验证清理结果
|
||
--
|
||
-- 注意事项:
|
||
-- - 本脚本会永久删除数据,执行前请备份数据库!
|
||
-- - 建议在测试环境先验证
|
||
-- ====================================
|