guoyu/log/数据清理-删除孤儿数据.sql
2025-12-11 23:28:07 +08:00

141 lines
4.0 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.

-- ========================================
-- 数据清理:删除孤儿学生数据
-- ========================================
-- 问题:删除用户时没有级联删除学生相关数据
-- 导致:课程分配统计的学生数 ≠ 用户管理的学生数
-- 解决:清理所有没有对应用户的学生数据
-- ========================================
-- 1. 查询孤儿学生数据(有学生记录但用户已删除)
SELECT
s.student_id,
s.student_name,
s.user_id,
'用户已删除' AS status
FROM study_student s
LEFT JOIN sys_user u ON s.user_id = u.user_id
WHERE u.user_id IS NULL;
-- 统计孤儿数据数量
SELECT COUNT(*) AS orphan_count
FROM study_student s
LEFT JOIN sys_user u ON s.user_id = u.user_id
WHERE u.user_id IS NULL;
-- ========================================
-- 清理步骤(按依赖顺序删除)
-- ========================================
-- 第1步删除学习记录详情study_learning_detail
DELETE FROM study_learning_detail
WHERE student_id IN (
SELECT s.student_id
FROM study_student s
LEFT JOIN sys_user u ON s.user_id = u.user_id
WHERE u.user_id IS NULL
);
-- 第2步删除学习记录study_learning_record
DELETE FROM study_learning_record
WHERE student_id IN (
SELECT s.student_id
FROM study_student s
LEFT JOIN sys_user u ON s.user_id = u.user_id
WHERE u.user_id IS NULL
);
-- 第3步删除课程分配study_course_assignment
DELETE FROM study_course_assignment
WHERE student_id IN (
SELECT s.student_id
FROM study_student s
LEFT JOIN sys_user u ON s.user_id = u.user_id
WHERE u.user_id IS NULL
);
-- 第4步删除学生班级关联study_student_class
DELETE FROM study_student_class
WHERE student_id IN (
SELECT s.student_id
FROM study_student s
LEFT JOIN sys_user u ON s.user_id = u.user_id
WHERE u.user_id IS NULL
);
-- 第5步删除考试记录study_exam_record
DELETE FROM study_exam_record
WHERE student_id IN (
SELECT s.student_id
FROM study_student s
LEFT JOIN sys_user u ON s.user_id = u.user_id
WHERE u.user_id IS NULL
);
-- 第6步删除答题记录study_student_answer
DELETE FROM study_student_answer
WHERE student_id IN (
SELECT s.student_id
FROM study_student s
LEFT JOIN sys_user u ON s.user_id = u.user_id
WHERE u.user_id IS NULL
);
-- 第7步删除学生变更记录study_student_change_log
DELETE FROM study_student_change_log
WHERE student_id IN (
SELECT s.student_id
FROM study_student s
LEFT JOIN sys_user u ON s.user_id = u.user_id
WHERE u.user_id IS NULL
);
-- 第8步删除语音评测记录study_voice_evaluation如果有
DELETE FROM study_voice_evaluation
WHERE student_id IN (
SELECT s.student_id
FROM study_student s
LEFT JOIN sys_user u ON s.user_id = u.user_id
WHERE u.user_id IS NULL
);
-- 第9步最后删除学生信息study_student
DELETE FROM study_student
WHERE user_id IN (
SELECT s.user_id
FROM study_student s
LEFT JOIN sys_user u ON s.user_id = u.user_id
WHERE u.user_id IS NULL
);
-- ========================================
-- 验证清理结果
-- ========================================
-- 再次查询孤儿学生(应该为空)
SELECT COUNT(*) AS remaining_orphans
FROM study_student s
LEFT JOIN sys_user u ON s.user_id = u.user_id
WHERE u.user_id IS NULL;
-- 查询当前学生数量
SELECT
'用户表学生数' AS type,
COUNT(*) AS count
FROM sys_user
WHERE user_type = 'student' OR user_type = '02'
UNION ALL
SELECT
'学生表数量' AS type,
COUNT(*) AS count
FROM study_student;
-- ========================================
-- 使用说明
-- ========================================
-- 1. 先执行前面的SELECT查询确认要删除的数据
-- 2. 备份数据库(重要!)
-- 3. 按顺序执行DELETE语句
-- 4. 执行验证查询,确认清理成功
-- 5. 重新编译并部署后端(包含级联删除修复)
-- ========================================