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