guoyu/log/清理孤儿数据-执行脚本.sql

173 lines
4.2 KiB
MySQL
Raw Normal View History

2025-12-11 23:28:07 +08:00
-- ========================================
-- 清理孤儿数据 - 立即执行
-- ========================================
-- 问题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;
-- 三个数字应该一致或接近