При удалении с ON DELETE SET NULL на таблице с внешними связями на саму себя удаляются так же связанные записи

Есть 2 таблицы:

--1
CREATE TABLE department (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100));
--2
CREATE TABLE employee (
id INT AUTO_INCREMENT PRIMARY KEY,
department_id INT,
chief_id INT,
name VARCHAR(100),
salary INT,
FOREIGN KEY (department_id) REFERENCES department (id) ON DELETE CASCADE ON UPDATE CASCADE,
FOREIGN KEY (chief_id) REFERENCES employee (id) ON DELETE SET NULL);

Вторая имеет зависимость на саму себя.

Далее я пытаюсь удалить одну запись, на которую ссылаются 3 другие записи, но разными командами.

1ая команда прямо указывает через id, что удалять:

DELETE FROM employee WHERE id=17;

Все записи, у которых было chief_id=17 теперь имеют chief_id=NULL, так как установлено ON DELETE SET NULL.

2ая команда использует подзапросы, но удаляет всё ТУ ЖЕ САМУЮ запись c id=17:

DELETE FROM employee WHERE department_id = (SELECT id FROM department WHERE name = 'managment') AND chief_id IS NULL);

Но при это автоматически удаляются так же и все записи с chief_id=17, то есть которые ссылались на удалённую запись!

Я вообще не понимаю, как это может работать. У меня же установлено ON DELETE SET NULL. Но работает только для 1-ой команды почему-то.


UPD: Добавляю примеры.

department:

╔════╦════════════╗
║ id ║    name    ║
╠════╬════════════╣
║  2 ║ management ║
╚════╩════════════╝

employee:

╔══╦════╦═══════════════╦══════════╦═════════╦════════╗
║  ║ id ║ department_id ║ chief_id ║  name   ║ salary ║
╠══╬════╬═══════════════╬══════════╬═════════╬════════╣
║  ║  5 ║             2 ║          ║ Rita    ║   5000 ║
║  ║  6 ║             2 ║        5 ║ John    ║   1400 ║
║  ║  7 ║             2 ║        5 ║ Fatima  ║    100 ║
║  ║  8 ║             2 ║        5 ║ Chester ║   2000 ║
║  ║    ║               ║          ║         ║        ║
╚══╩════╩═══════════════╩══════════╩═════════╩════════╝

Теперь если выполнить команду:

DELETE FROM employee WHERE id=5;

То результат будет такой:

╔══╦════╦═══════════════╦══════════╦═════════╦════════╗
║  ║ id ║ department_id ║ chief_id ║  name   ║ salary ║
╠══╬════╬═══════════════╬══════════╬═════════╬════════╣
║  ║  8 ║             2 ║          ║ Chester ║   2000 ║
║  ║  7 ║             2 ║          ║ Fatima  ║    100 ║
║  ║  6 ║             2 ║          ║ John    ║   1400 ║
║  ║    ║               ║          ║         ║        ║
╚══╩════╩═══════════════╩══════════╩═════════╩════════╝

А если вместо нее выполнить команду (ссылается на ту же запись):

DELETE FROM employee WHERE department_id = (SELECT id FROM department WHERE name = 'management') AND chief_id IS NULL;

Результат:

╔══╦════╦═══════════════╦══════════╦══════╦════════╗
║  ║ id ║ department_id ║ chief_id ║ name ║ salary ║
╠══╬════╬═══════════════╬══════════╬══════╬════════╣
║  ║    ║               ║          ║      ║        ║
╚══╩════╩═══════════════╩══════════╩══════╩════════╝

Удалено всё!


Ответы (0 шт):