表中的DELETE是一个FK,指的是当前表的PK

问题描述 投票:0回答:4

有两个表:

enter image description here

EMPLOYEES表中,EMPLOYEE_ID是主键。 MGR_ID是经理标识符,指的是EMPLOYEE_IDDEPT_IDDEPARTMENT_ID表的DEPARTMENTS列的外键。

DEPARTMENTS表中,DEPARTMENT_ID是主键。

当我执行以下命令时

DELETE
FROM departments
WHERE department_id = 40;

我得到了这个结果

0行影响

我的外键有参考完整性有限 - ON DELETE CASCADE。为什么DELETE不是级联?是什么MGR_ID是指这张桌子的EMPLOYEE_ID列?

sql-server sql-delete
4个回答
0
投票

如果您的表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
投票

尝试删除DEPT_ID = 40的EMPLOYEES中的所有行

DELETE 
FROM EMPLOYEES
WHERE DEPT_ID=40

并在它执行你的sql之后:

DELETE
FROM departments
WHERE department_id = 40;

0
投票

您无法删除它,因为它具有与主键的依赖关系,如果您还想继续,则必须中断依赖关系或删除查询中的依赖关系。


0
投票

发生的是简单的引用完整性,并且数据库正确阻止了您的删除语句。

假设您可以使用DEPARTMENTS删除Department_ID = 40中的行 然后在你的表EMPLOYEES中将至少有一行指向一个不存在的部门! 换句话说,您的数据库将会损坏。 这是外键的目的,以确保完全没有办法破坏你的数据库。

DEPARTMENTS删除此行的唯一方法是首先从该Department_ID中拆分EMPLOYEES中的所有行。

因此,要么将所有员工首先联系到不同的部门

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

或者你删除所有员工

delete from EMPLOYEE where Dept_ID = 40

现在您可以删除您的部门

但我仍然不明白为什么你没有收到错误信息......

© www.soinside.com 2019 - 2024. All rights reserved.