109 lines
3.0 KiB
SQL
109 lines
3.0 KiB
SQL
-- ========================================
|
||
-- 添加外键约束 - 防止孤儿数据
|
||
-- ========================================
|
||
-- 作用:删除用户时自动级联删除学生相关数据
|
||
-- 解决:课程分配人数 ≠ 用户管理人数的问题
|
||
-- ========================================
|
||
|
||
-- 第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;
|
||
|
||
-- 如果有孤儿数据,先执行清理脚本!
|
||
|
||
-- ========================================
|
||
-- 第2步:添加外键约束
|
||
-- ========================================
|
||
|
||
-- 2.1 学生班级关联表
|
||
ALTER TABLE student_class
|
||
ADD CONSTRAINT fk_student_class_user
|
||
FOREIGN KEY (student_id)
|
||
REFERENCES sys_user(user_id)
|
||
ON DELETE CASCADE; -- 删除用户时自动删除班级关联
|
||
|
||
-- 2.2 课程分配表
|
||
ALTER TABLE course_assignment
|
||
ADD CONSTRAINT fk_assignment_student
|
||
FOREIGN KEY (student_id)
|
||
REFERENCES sys_user(user_id)
|
||
ON DELETE CASCADE; -- 删除用户时自动删除课程分配
|
||
|
||
-- 2.3 学习记录表
|
||
ALTER TABLE learning_record
|
||
ADD CONSTRAINT fk_learning_student
|
||
FOREIGN KEY (student_id)
|
||
REFERENCES sys_user(user_id)
|
||
ON DELETE CASCADE; -- 删除用户时自动删除学习记录
|
||
|
||
-- 2.4 学习记录详情表
|
||
ALTER TABLE learning_detail
|
||
ADD CONSTRAINT fk_detail_student
|
||
FOREIGN KEY (student_id)
|
||
REFERENCES sys_user(user_id)
|
||
ON DELETE CASCADE;
|
||
|
||
-- 2.5 考试记录表
|
||
ALTER TABLE exam_record
|
||
ADD CONSTRAINT fk_exam_student
|
||
FOREIGN KEY (student_id)
|
||
REFERENCES sys_user(user_id)
|
||
ON DELETE CASCADE;
|
||
|
||
-- 2.6 答题记录表
|
||
ALTER TABLE student_answer
|
||
ADD CONSTRAINT fk_answer_student
|
||
FOREIGN KEY (student_id)
|
||
REFERENCES sys_user(user_id)
|
||
ON DELETE CASCADE;
|
||
|
||
-- ========================================
|
||
-- 第3步:验证外键约束
|
||
-- ========================================
|
||
|
||
SELECT
|
||
TABLE_NAME,
|
||
CONSTRAINT_NAME,
|
||
REFERENCED_TABLE_NAME,
|
||
DELETE_RULE
|
||
FROM information_schema.key_column_usage
|
||
WHERE table_schema = 'study'
|
||
AND referenced_table_name = 'sys_user'
|
||
AND constraint_name LIKE 'fk%';
|
||
|
||
-- 应该显示所有刚添加的外键约束
|
||
|
||
-- ========================================
|
||
-- 第4步:测试外键约束
|
||
-- ========================================
|
||
|
||
-- 测试方法:
|
||
-- 1. 创建一个测试用户
|
||
-- 2. 给该用户分配班级、课程等
|
||
-- 3. 删除该用户
|
||
-- 4. 检查相关数据是否自动删除
|
||
|
||
-- ========================================
|
||
-- 使用说明
|
||
-- ========================================
|
||
-- 1. 先确认孤儿数据已清理(第1步)
|
||
-- 2. 执行第2步添加外键约束
|
||
-- 3. 执行第3步验证
|
||
-- 4. 以后删除用户时,相关数据会自动删除
|
||
-- 5. 不会再产生孤儿数据
|
||
-- 6. 课程分配人数 = 用户管理人数
|
||
-- ========================================
|