规则很简单:
如果存在引用您要删除的行的其他行,则无法删除该行。
示例:大学摄影课程在courses 表中创建为一行。
INSERT INTO courses SET course_id = 1234, title = 'Photography';
参加课程的人:
INSERT INTO enrollments SET course_id = 1234, student_id = 9877;
INSERT INTO enrollments SET course_id = 1234, student_id = 9876;
INSERT INTO enrollments SET course_id = 1234, student_id = 9875;
然后讲师想取消课程。
DELETE FROM courses WHERE course_id = 1234;
这是被阻止的,因为enrollments 中有行引用了courses 中的行。
同样,学生可能想在本学期退学。他们试图删除他们的记录:
DELETE FROM students WHERE student_id = 9877;
这已被阻止,因为该学生仍在摄影课上注册。
enrollments 类是一个桥接表(我称这些表为交集表,但这些类型的表没有官方术语)。它基本上是一对外键列,分别引用了courses和students这两个表。
enrollments 中的外键约束要求其他两个表中的每个引用行都存在。当存在引用它的注册时,您不能删除 courses 行或 students 行。
处理此问题的方法是在删除引用行之前删除依赖行(具有外键约束的行)。
可选的ON DELETE CASCADE 语法使外键约束自动处理这个问题。也就是说,删除courses 中的一行将自动删除所有引用该课程的行。如果您不使用此选项,则尝试删除课程会返回错误。