【问题标题】:Using the ON DELETE CASCADE option on a foreign key在外键上使用 ON DELETE CASCADE 选项
【发布时间】:2021-03-29 19:01:17
【问题描述】:

在外键上使用ON DELETE CASCADE 时,级联选项是否仅适用于同一个表中的条目?

考虑使用以下选项创建的表 Employee:

CONSTRAINT EMPSUPERFK FOREIGN KEY (Super_ssn) REFERENCES EMPLOYEE(Ssn) ON DELETE CASCADE ON UPDATE CASCADE,

在数据库状态下运行以下命令会发生什么 如图 5.6 所示?删除 Lname = 'Borg' 的员工

答案是,所有以 Borg 作为经理的员工都将被删除,所有以 Borg 作为经理的员工也将被删除,等等(请注意,解决方案不是来自本书的作者,而是为什么我在这里问)。

我以为包括该员工在内的所有内容也会被删除,例如部门“总部”,因为他是经理等。什么是正确的?

【问题讨论】:

  • 我要注意的是,如果您正在学习 SQL 的 Oracle 方言,您发布的外键定义是无效的。 Oracle 不支持on update cascade 子句。所以从技术上讲,答案应该是当你尝试创建外键时会抛出错误,而随后的delete 语句只会删除单个“Borg”行。

标签: sql oracle foreign-keys sql-delete


【解决方案1】:

您正在显示一个自引用外键,它将员工的经理与代表经理的同一表中的相应记录相关联:这是一个层次结构。

当一个父级被删除(这就是 Borg)时,所有的子级都会自动递归地删除。表中的所有员工都直接或间接地引用了 Borg,因此表中的所有记录都将被删除。

我以为包括该员工在内的所有内容也会被删除,例如部门“总部”,因为他是经理等等。什么是正确的?

问题中提供的信息并未暗示任何此类事情。为此,通常应该在表department 中设置一个外键,以将列mgr_ssn 与表employee 中的列ssn 关联起来,并使用on delete cascade 选项。尽管它可能存在,但在所问的问题中没有迹象表明它确实存在。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-14
    • 1970-01-01
    • 1970-01-01
    • 2019-10-06
    • 1970-01-01
    • 2012-02-11
    • 2017-04-09
    • 2019-09-26
    相关资源
    最近更新 更多