Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 关于桥接表的外键设置_Mysql_Foreign Keys - Fatal编程技术网

Mysql 关于桥接表的外键设置

Mysql 关于桥接表的外键设置,mysql,foreign-keys,Mysql,Foreign Keys,关于桥接表的外键设置,我有一个问题。我仍然不确定删除过程是如何工作的。我的外键当前都设置为On Delete:No Action,那么这是否意味着在桥接表的情况下,为了删除一个或两个父表中的记录,我必须首先删除它们在桥接表中的记录,或者它在多对多关系中的工作方式是否不同?如果这是一个简单、愚蠢的问题,我深表歉意,但对于数据库新手来说,在任何地方都很难找到清晰、简单、易于阅读的文档来解释这些事情。规则非常简单: 如果存在引用要删除的行的其他行,则无法删除该行 示例:大学摄影课程在课程表中创建为一行

关于桥接表的外键设置,我有一个问题。我仍然不确定删除过程是如何工作的。我的外键当前都设置为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上的可选
语法使外键约束自动处理此问题。也就是说,删除
课程中的一行将自动删除引用该课程的任何行。如果不使用此选项,则尝试删除课程将返回错误。

如果有孩子,则无法删除家长。然后,在删除父项之前先删除子项。