SQL ON根据条件删除CASCADE

时间:2018-05-15 12:50:24

标签: sql database oracle11g foreign-keys

我有两个表与Staff成员表中的外键链接。我试图设置外键,以便如果没有来自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 个答案:

答案 0 :(得分:0)

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

如果要使用单个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>

请参阅?只要细节存在,就无法删除master。