-- ======================================== -- 添加外键约束 - 防止孤儿数据 -- ======================================== -- 作用:删除用户时自动级联删除学生相关数据 -- 解决:课程分配人数 ≠ 用户管理人数的问题 -- ======================================== -- 第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. 课程分配人数 = 用户管理人数 -- ========================================