УДАЛИТЬ в таблице где FK ссылается на PK текущей таблицы - PullRequest
0 голосов
/ 21 марта 2019

Есть две таблицы:

enter image description here

В таблице EMPLOYEES EMPLOYEE_ID является первичным ключом. MGR_ID является идентификатором менеджера и относится к EMPLOYEE_ID. DEPT_ID - это внешний ключ к столбцу DEPARTMENT_ID таблицы DEPARTMENTS.

В таблице DEPARTMENTS первичным ключом является DEPARTMENT_ID.

Когда я выполняю следующую команду

DELETE
FROM departments
WHERE department_id = 40;

Я получаю этот результат

0 строк влияют на

У моего внешнего ключа ссылочная целостность ограничена - ON DELETE CASCADE. Почему DELETE не является каскадом? Имеет ли значение, что MGR_ID относится к столбцу EMPLOYEE_ID этой таблицы?

Ответы [ 4 ]

0 голосов
/ 21 марта 2019

Что произошло - это простая ссылочная интеграция, которая увеличилась, и ваш оператор удаления правильно заблокирован базой данных.

Предположим, вы можете удалить строку в DEPARTMENTS с помощью Department_ID = 40
Тогдав вашей таблице EMPLOYEES будет хотя бы одна строка, указывающая на несуществующий отдел !!!
Другими словами, ваша база данных будет повреждена.
Это цель внешних ключей, чтобыубедитесь, что нет никакой возможности испортить вашу базу данных таким образом.

Единственный способ удалить эту строку из DEPARTMENTS - сначала отсоединить все строки в EMPLOYEES от этого Department_ID.

Таким образом, либо сначала вы соединяете всех сотрудников с другим отделом

update EMPLOYEE
Set    Dept_ID = 20 -- or some other...
where  Dept_ID = 40

или вы удаляете всех сотрудников

delete from EMPLOYEE where Dept_ID = 40

А теперь вы можете удалить свой отдел

Но я до сих пор не понимаю, почему вы не получили сообщение об ошибке ...

0 голосов
/ 21 марта 2019

Если ваша таблица Employees имеет оператор, подобный следующему:

CONSTRAINT Dept_ID_FK__Departments FOREIGN KEY (department_id ) 
    REFERENCES dbo.Departments(department_id )

Это означает, что вы не можете удалить, как написали, потому что SQL Server не позволит вам удалить строки с department_id = 40:

DELETE
FROM departments
WHERE department_id = 40;

Поскольку в таблице Employee есть строки с DeptId, которые связаны с таблицей Departments.Как это приведет данные в поврежденное состояние.

0 голосов
/ 21 марта 2019

Попробуйте удалить все строки в СОТРУДНИКАХ, где DEPT_ID = 40

DELETE 
FROM EMPLOYEES
WHERE DEPT_ID=40

и после этого выполните ваш sql:

DELETE
FROM departments
WHERE department_id = 40;
0 голосов
/ 21 марта 2019

Вы не можете удалить его, потому что у него есть зависимости от первичного ключа, если вы хотите продолжить, вам нужно либо сломать зависимости, либо удалить зависимости в запросе.

...