【问题标题】:Foreign Key settings with regards to bridging tables关于桥接表的外键设置
【发布时间】:2020-07-26 11:27:22
【问题描述】:

我对桥接表的外键设置有疑问。我仍然不确定删除过程是如何工作的。我的外键目前都设置为 On Delete: No Action,这是否意味着在桥接表的情况下,为了删除一个或两个父表中的记录,我必须删除它们所包含的记录首先在桥接表中,还是在多对多关系中的工作方式不同?如果这是一个简单、愚蠢的问题,我们深表歉意,但对于刚接触数据库的人来说,似乎很难在任何地方找到清晰、简单、易于理解的文档来解释这些事情。

【问题讨论】:

  • 如果有子级,则不能删除父级。然后在删除父级之前删除子级。

标签: mysql foreign-keys


【解决方案1】:

规则很简单:

如果存在引用您要删除的行的其他行,则无法删除该行。

示例:大学摄影课程在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 类是一个桥接表(我称这些表为交集表,但这些类型的表没有官方术语)。它基本上是一对外键列,分别引用了coursesstudents这两个表。

enrollments 中的外键约束要求其他两个表中的每个引用行都存在。当存在引用它的注册时,您不能删除 courses 行或 students 行。

处理此问题的方法是在删除引用行之前删除依赖行(具有外键约束的行)。

可选的ON DELETE CASCADE 语法使外键约束自动处理这个问题。也就是说,删除courses 中的一行将自动删除所有引用该课程的行。如果您不使用此选项,则尝试删除课程会返回错误。

【讨论】:

    猜你喜欢
    • 2021-10-08
    • 2012-02-14
    • 2014-09-04
    • 1970-01-01
    • 2021-11-02
    • 2021-12-18
    • 2012-06-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多