guoyu/log/数据清理-删除孤儿数据.sql

141 lines
4.0 KiB
MySQL
Raw Normal View History

2025-12-11 23:28:07 +08:00
-- ========================================
-- 数据清理:删除孤儿学生数据
-- ========================================
-- 问题:删除用户时没有级联删除学生相关数据
-- 导致:课程分配统计的学生数 ≠ 用户管理的学生数
-- 解决:清理所有没有对应用户的学生数据
-- ========================================
-- 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. 重新编译并部署后端(包含级联删除修复)
-- ========================================