表中的DELETE,其中FK引用当前表的PK

时间:2019-03-21 08:42:24

标签: sql-server sql-delete

有两个表:

enter image description here

<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script> <div id="app"> <input type="number" v-model="n" /> <p> {{ always100 }}</p> </div>表中,EMPLOYEES是主键。 EMPLOYEE_ID是管理员标识符,指的是MGR_IDEMPLOYEE_IDDEPT_ID表的DEPARTMENT_ID列的外键。

DEPARTMENTS表中,DEPARTMENTS是主键。

当我执行以下命令时

DEPARTMENT_ID

我得到这个结果

  

0行影响

我的外键的参照完整性受到限制-DELETE FROM departments WHERE department_id = 40; 。为什么删除不级联? 该表的ON DELETE CASCADE引用列中的MGR_ID无关紧要吗?

4 个答案:

答案 0 :(得分:0)

您不能删除它,因为它与主键有依赖关系,如果您仍要继续操作,则必须打破依赖关系或在查询中删除依赖关系。

答案 1 :(得分: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表。因为它将使数据进入损坏状态。

答案 2 :(得分:0)

Try to delete all rows in EMPLOYEES where DEPT_ID=40

DELETE 
FROM EMPLOYEES
WHERE DEPT_ID=40

and after it execute your sql:

DELETE
FROM departments
WHERE department_id = 40;

答案 3 :(得分:0)

发生的事情是简单的引用完整性提高了,并且您的delete语句已被数据库正确阻止。

假设您可以在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

现在您可以删除部门

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