guoyu/log/清理孤儿数据-执行脚本.sql
2025-12-11 23:28:07 +08:00

173 lines
4.2 KiB
SQL
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

-- ========================================
-- 清理孤儿数据 - 立即执行
-- ========================================
-- 问题4194条班级关联记录的学生已被删除
-- 影响:课程分配学生数 ≠ 用户管理学生数
-- 解决:删除所有孤儿数据
-- ========================================
-- 第1步查看要删除的数据确认
SELECT
'孤儿班级关联' AS type,
COUNT(*) AS count
FROM student_class sc
LEFT JOIN sys_user u ON sc.student_id = u.user_id
WHERE u.user_id IS NULL
UNION ALL
SELECT
'孤儿课程分配' AS type,
COUNT(*) AS count
FROM course_assignment ca
LEFT JOIN sys_user u ON ca.student_id = u.user_id
WHERE u.user_id IS NULL
UNION ALL
SELECT
'孤儿学习记录' AS type,
COUNT(*) AS count
FROM learning_record lr
LEFT JOIN sys_user u ON lr.student_id = u.user_id
WHERE u.user_id IS NULL;
-- ========================================
-- 第2步执行清理按依赖顺序
-- ========================================
-- 2.1 删除孤儿学习记录详情
DELETE FROM learning_detail
WHERE student_id IN (
SELECT student_id FROM (
SELECT ld.student_id
FROM learning_detail ld
LEFT JOIN sys_user u ON ld.student_id = u.user_id
WHERE u.user_id IS NULL
) AS orphan_details
);
-- 2.2 删除孤儿学习记录
DELETE FROM learning_record
WHERE student_id IN (
SELECT student_id FROM (
SELECT lr.student_id
FROM learning_record lr
LEFT JOIN sys_user u ON lr.student_id = u.user_id
WHERE u.user_id IS NULL
) AS orphan_records
);
-- 2.3 删除孤儿课程分配
DELETE FROM course_assignment
WHERE student_id IN (
SELECT student_id FROM (
SELECT ca.student_id
FROM course_assignment ca
LEFT JOIN sys_user u ON ca.student_id = u.user_id
WHERE u.user_id IS NULL
) AS orphan_assignments
);
-- 2.4 删除孤儿学生班级关联(重要!)
DELETE FROM student_class
WHERE student_id IN (
SELECT student_id FROM (
SELECT sc.student_id
FROM student_class sc
LEFT JOIN sys_user u ON sc.student_id = u.user_id
WHERE u.user_id IS NULL
) AS orphan_classes
);
-- 2.5 删除孤儿考试记录
DELETE FROM exam_record
WHERE student_id IN (
SELECT student_id FROM (
SELECT er.student_id
FROM exam_record er
LEFT JOIN sys_user u ON er.student_id = u.user_id
WHERE u.user_id IS NULL
) AS orphan_exams
);
-- 2.6 删除孤儿答题记录
DELETE FROM student_answer
WHERE student_id IN (
SELECT student_id FROM (
SELECT sa.student_id
FROM student_answer sa
LEFT JOIN sys_user u ON sa.student_id = u.user_id
WHERE u.user_id IS NULL
) AS orphan_answers
);
-- 2.7 删除孤儿学生变更记录
DELETE FROM study_student_change_log
WHERE student_id IN (
SELECT student_id FROM (
SELECT sc.student_id
FROM study_student_change_log sc
LEFT JOIN sys_user u ON sc.student_id = u.user_id
WHERE u.user_id IS NULL
) AS orphan_changes
);
-- ========================================
-- 第3步验证结果
-- ========================================
-- 再次查询孤儿数据应该全为0
SELECT
'孤儿班级关联' AS type,
COUNT(*) AS remaining
FROM student_class sc
LEFT JOIN sys_user u ON sc.student_id = u.user_id
WHERE u.user_id IS NULL
UNION ALL
SELECT
'孤儿课程分配' AS type,
COUNT(*) AS remaining
FROM course_assignment ca
LEFT JOIN sys_user u ON ca.student_id = u.user_id
WHERE u.user_id IS NULL
UNION ALL
SELECT
'孤儿学习记录' AS type,
COUNT(*) AS remaining
FROM learning_record lr
LEFT JOIN sys_user u ON lr.student_id = u.user_id
WHERE u.user_id IS NULL;
-- 应该全部显示 0
-- ========================================
-- 第4步统计清理结果
-- ========================================
SELECT
'用户表学生数' AS type,
COUNT(*) AS count
FROM sys_user
WHERE user_type IN ('00', '01', '02', 'student')
UNION ALL
SELECT
'班级学生数' AS type,
COUNT(DISTINCT student_id) AS count
FROM student_class
UNION ALL
SELECT
'课程分配学生数' AS type,
COUNT(DISTINCT student_id) AS count
FROM course_assignment;
-- 三个数字应该一致或接近