guoyu/log/数据清理-安全版本.sql
2025-12-11 23:28:07 +08:00

133 lines
3.7 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
'用户表总数' AS item,
COUNT(*) AS count
FROM sys_user
UNION ALL
SELECT
'学生类型用户' AS item,
COUNT(*) AS count
FROM sys_user
WHERE user_type = '02' OR user_type = 'student'
UNION ALL
SELECT
'班级关联数' AS item,
COUNT(*) AS count
FROM study_student_class;
-- ========================================
-- 方案1如果没有study_student表
-- 学生信息直接在sys_user表中
-- ========================================
-- 清理学习记录详情通过user_id关联
DELETE FROM study_learning_detail
WHERE student_id NOT IN (
SELECT user_id FROM sys_user WHERE user_type IN ('02', 'student')
);
-- 清理学习记录
DELETE FROM study_learning_record
WHERE student_id NOT IN (
SELECT user_id FROM sys_user WHERE user_type IN ('02', 'student')
);
-- 清理课程分配
DELETE FROM study_course_assignment
WHERE student_id NOT IN (
SELECT user_id FROM sys_user WHERE user_type IN ('02', 'student')
);
-- 清理学生班级关联(重要:这是导致数量不一致的主要原因)
DELETE FROM study_student_class
WHERE student_id NOT IN (
SELECT user_id FROM sys_user WHERE user_type IN ('02', 'student')
);
-- 清理考试记录
DELETE FROM study_exam_record
WHERE student_id NOT IN (
SELECT user_id FROM sys_user WHERE user_type IN ('02', 'student')
);
-- 清理答题记录
DELETE FROM study_student_answer
WHERE student_id NOT IN (
SELECT user_id FROM sys_user WHERE user_type IN ('02', 'student')
);
-- 清理变更记录
DELETE FROM study_student_change_log
WHERE student_id NOT IN (
SELECT user_id FROM sys_user WHERE user_type IN ('02', 'student')
);
-- ========================================
-- 验证清理结果
-- ========================================
SELECT
'用户表学生数' AS type,
COUNT(*) AS count
FROM sys_user
WHERE user_type IN ('02', 'student')
UNION ALL
SELECT
'班级学生数' AS type,
COUNT(DISTINCT student_id) AS count
FROM study_student_class
UNION ALL
SELECT
'课程分配学生数' AS type,
COUNT(DISTINCT student_id) AS count
FROM study_course_assignment;
-- 应该显示三个数字一致或接近
-- ========================================
-- 如果需要更激进的清理(删除所有没有用户记录的数据)
-- ========================================
-- 查询孤儿班级关联(有班级关联但用户不存在)
SELECT
sc.student_id,
COUNT(*) AS class_count,
'用户不存在' AS status
FROM study_student_class sc
LEFT JOIN sys_user u ON sc.student_id = u.user_id
WHERE u.user_id IS NULL
GROUP BY sc.student_id;
-- 如果上面查询有结果,执行删除
DELETE FROM study_student_class
WHERE student_id IN (
SELECT sc.student_id
FROM study_student_class sc
LEFT JOIN sys_user u ON sc.student_id = u.user_id
WHERE u.user_id IS NULL
);
-- ========================================
-- 最终验证
-- ========================================
-- 确认没有孤儿数据
SELECT COUNT(*) AS orphan_class_records
FROM study_student_class sc
LEFT JOIN sys_user u ON sc.student_id = u.user_id
WHERE u.user_id IS NULL;
-- 应该返回 0
-- 确认数量一致
SELECT
(SELECT COUNT(*) FROM sys_user WHERE user_type IN ('02', 'student')) AS user_count,
(SELECT COUNT(DISTINCT student_id) FROM study_student_class) AS class_student_count,
(SELECT COUNT(DISTINCT student_id) FROM study_course_assignment) AS assignment_student_count;
-- 三个数字应该一致或接近