SQL ON DELETE CASCADE 基于条件

Posted

技术标签:

【中文标题】SQL ON DELETE CASCADE 基于条件【英文标题】:SQL ON DELETE CASCADE based on a condition 【发布时间】:2018-05-15 12:50:24 【问题描述】:

我有两个表,它们与 Staff member 表中的外键链接。我正在尝试设置外键,以便在职位表中的一行在员工表中没有关联的员工时被删除。我正在使用 ON DELETE CASCADE 但是即使仍有与该职位相关的工作人员,这也会删除该行。

Position Table
----------------------------------------------
----Attribute-------Type-------------Keys-----
----------------------------------------------
-    Title     -- VARCHAR(20)  --Primary Key--
-    MaxSalary -- DECIMAL(8,2) --     No     -
-    MinSalary -- DECIMAL(8,2) --     No     -
----------------------------------------------

StaffMember Table
-----------------------------------------------------
----Attribute-------Type-----------------Keys--------
-----------------------------------------------------
-    StaffNo    -- INTEGER     --    Primary Key   --
-    Name       -- VARCHAR(20) --         No        -
-    Salary     -- DECIMAL(8,2)--         No        -
-    StaffTitle -- VARCHAR(20) --FK Position(Title) -
-----------------------------------------------------

CREATE TABLE StaffMember(
StaffNo INTEGER PRIMARY KEY,
Name VARCHAR(20),
Salary DECIMAL(8,2),
StaffTitle VARCHAR(20) FOREIGN KEY REFERENCES Position(Title) ON DELETE CASCADE);

【问题讨论】:

【参考方案1】:

如果我对你的理解正确,那么你所做的与你想要的完全相反。

ON DELETE CASCADE 用于使用单个 DELETE 命令同时删除主行和详细行,即删除主行将删除其所有详细信息。

你说过你想阻止它发生。

所以 - 从约束语句中删除该选项,即

stafftitle varchar2(20) constraint fk_staff_position references position (title)

这是一个例子:

SQL> create table position (title varchar2(20) primary key);

Table created.

SQL> create table staffmember
  2    (staffno    integer primary key,
  3     name       varchar2(20),
  4     salary     decimal (8, 2),
  5     stafftitle varchar2(20) constraint fk_staff_pos references position (title)
  6    );

Table created.

SQL> insert into position (title) values ('some title');

1 row created.

SQL> insert into staffmember (staffno, name, salary, stafftitle)
  2    values (1, 'name', 100, 'some title');

1 row created.

SQL> delete from position;
delete from position
*
ERROR at line 1:
ORA-02292: integrity constraint (SCOTT.FK_STAFF_POS) violated - child record found


SQL>

看到了吗?只要有详细信息,您就不能删除母版。

【讨论】:

我实际上希望只有在从子表中删除链接到它的最后一个条目时才删除主表中的行。例如,如果职位表中有一个条目与 StaffMember 表中的一个条目链接到它,我希望在删除最后一个剩余的员工时删除职位表中的条目。 级联作品从大师到细节,反之亦然。

以上是关于SQL ON DELETE CASCADE 基于条件的主要内容,如果未能解决你的问题,请参考以下文章

如何实现关系表的级联删除(ON DELETE CASCADE的用法)

ON CASCADE DELETE 对同一张表之间的多对多关系

1) 不能在 DELETE SET NULL 或 ON DELETE CASCADE 上创建外键 2) 不能在 DELETE CASCADE 上创建外键

为啥我的模型的“on_delete=models.CASCADE”不生成级联外键约束?

on_delete=models.CASCADE级联删除

on_delete=models.CASCADE级联删除