SQL ON DELETE CASCADE, основанный на условии - PullRequest
0 голосов
/ 15 мая 2018

У меня есть две таблицы, которые связаны с внешним ключом в таблице сотрудников. Я пытаюсь настроить внешний ключ так, чтобы строка в таблице позиций была удалена, если у нее нет связанных сотрудников из таблицы сотрудников. Я использую 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 голосов
/ 16 мая 2018

Если я вас правильно понял, вы делаете в точности то, что хотели бы.

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>

См? Вы не можете удалить мастер, пока есть детали.

...