ON DELETE CASCADE作用范围及Employee表删除操作疑问
关于ON DELETE CASCADE的作用范围与你的业务场景分析
嘿,这个问题问得很精准,我来拆解清楚:
一、ON DELETE CASCADE 是不是仅作用于同一张表?
当然不是。ON DELETE CASCADE的作用逻辑是跟着外键的定义走:
- 如果外键是自引用(比如你例子里Employee表的Super_ssn引用自身的Ssn),那级联操作就发生在同一张表内;
- 如果外键是跨表引用(比如Department表的Mgr_ssn引用Employee的Ssn),并且这个跨表外键定义了
ON DELETE CASCADE,那删除Employee表的条目时,会触发Department表中对应关联条目的删除。
简单说:它的作用范围是定义了该外键的那张表,而非仅局限于被引用的表。
二、针对你的业务场景的具体分析
先看你给出的约束:
CONSTRAINT EMPSUPERFK FOREIGN KEY (Super_ssn) REFERENCES EMPLOYEE(Ssn) ON DELETE CASCADE ON UPDATE CASCADE
这个约束是Employee表内部的自引用外键,仅关联Employee表内的员工上下级关系。
当执行DELETE EMPLOYEE WHERE Lname = 'Borg'时:
- 首先会删除Borg的Employee条目;
- 然后递归触发所有
Super_ssn等于Borg的Ssn的员工条目删除,接着再递归删除这些被删除员工的下属(因为他们的Super_ssn指向了已被删除的员工Ssn)——这就是你提到的“递归删除所有以Borg及其被删除下属为经理的员工”,这部分是完全正确的。
至于你提到的“删除该员工关联的Headquarters部门”,这个不会发生,原因很简单:
你的当前约束只定义了Employee表内部的级联规则,没有在部门表(比如假设叫Department)中定义引用Employee.Ssn的外键并加上
ON DELETE CASCADE。只有当部门表有类似CONSTRAINT DEPTMGRFK FOREIGN KEY (Mgr_ssn) REFERENCES EMPLOYEE(Ssn) ON DELETE CASCADE这样的约束时,删除Borg才会同时删除他管理的部门。
总结
所以第一种观点是正确的,仅会递归删除Employee表内Borg的所有层级下属;你的第二个想法(删除关联部门)不成立,除非部门表有对应的跨表级联删除外键约束。
内容的提问来源于stack exchange,提问作者Sergio
相关产品推荐
相关产品推荐

