При удалении с 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 ║
╠══╬════╬═══════════════╬══════════╬══════╬════════╣
║ ║ ║ ║ ║ ║ ║
╚══╩════╩═══════════════╩══════════╩══════╩════════╝
Удалено всё!