Mysql 关于桥接表的外键设置
关于桥接表的外键设置,我有一个问题。我仍然不确定删除过程是如何工作的。我的外键当前都设置为On Delete:No Action,那么这是否意味着在桥接表的情况下,为了删除一个或两个父表中的记录,我必须首先删除它们在桥接表中的记录,或者它在多对多关系中的工作方式是否不同?如果这是一个简单、愚蠢的问题,我深表歉意,但对于数据库新手来说,在任何地方都很难找到清晰、简单、易于阅读的文档来解释这些事情。规则非常简单: 如果存在引用要删除的行的其他行,则无法删除该行 示例:大学摄影课程在Mysql 关于桥接表的外键设置,mysql,foreign-keys,Mysql,Foreign Keys,关于桥接表的外键设置,我有一个问题。我仍然不确定删除过程是如何工作的。我的外键当前都设置为On Delete:No Action,那么这是否意味着在桥接表的情况下,为了删除一个或两个父表中的记录,我必须首先删除它们在桥接表中的记录,或者它在多对多关系中的工作方式是否不同?如果这是一个简单、愚蠢的问题,我深表歉意,但对于数据库新手来说,在任何地方都很难找到清晰、简单、易于阅读的文档来解释这些事情。规则非常简单: 如果存在引用要删除的行的其他行,则无法删除该行 示例:大学摄影课程在课程表中创建为一行
课程
表中创建为一行
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;
这是被阻止的,因为在注册
中有行引用了课程
中的行
同样,学生本学期可能想退学。他们试图删除他们的记录:
DELETE FROM students WHERE student_id = 9877;
这被阻止了,因为该学生仍在报名参加摄影课
enrollments
类是一个桥接表(我称之为交叉表,但对于这些类型的表没有官方术语)。它基本上是一对外键列,引用相应的表课程
和学生
注册
中的外键约束要求其他两个表中的每个引用行都存在。当存在引用该行的注册时,您不能删除课程
行或学生
行
处理此问题的方法是在删除引用行之前删除依赖行(具有外键约束的行)
DELETE CASCADE上的可选
语法使外键约束自动处理此问题。也就是说,删除课程中的一行将自动删除引用该课程的任何行。如果不使用此选项,则尝试删除课程将返回错误。如果有孩子,则无法删除家长。然后,在删除父项之前先删除子项。