【问题标题】:DELETE statement conflicted with Reference constraints in SQL Stored ProcedureDELETE 语句与 SQL 存储过程中的引用约束冲突
【发布时间】:2021-11-21 06:57:01
【问题描述】:

我的 Employee 表的主键列是 (EmpID),它在两个 Other 表中被引用 EmployeeEducation 表和EmployeeBankInformation 表。

我想根据他们的 ID 删除 Employee,但是当我运行存储过程时,我的控制器抛出了由于 EmpID 列而导致外键引用约束冲突的错误。

ALTER PROCEDURE [dbo].[RemoveEmployee]
(
    @EmpID int
)
AS
BEGIN
    DELETE FROM Employee WHERE EmpID = @EmpID
    DELETE FROM EmployeeEducation WHERE EmpID = @EmpID
    DELETE FROM EmployeeBankInformation WHERE EmpID = @EmpID
END

我哪里错了?你们谁能告诉我在我的程序中犯了什么错误?

【问题讨论】:

  • 您需要从引用Employee 作为外键的表中首先DELETE,然后从表EmployeeDELETE。首先删除Employee 中的行是不好的,因为这会导致表EmployeeEducationEmployeeBankInformation 中的外键约束失败。
  • 旁注:总是模式限定你的对象。不要依赖 USER 的默认架构是正确的。
  • @Larnu 你的意思是说我上面写的我只是把那些陈述反过来写
  • 有点。很可能(我不能确定,因为我没有你的表的定义)不管你是先从 DELETE 还是 EmployeeEducation 还是 EmployeeBankInformation,但它确实 您从Employee最后删除的事项。

标签: sql sql-server stored-procedures ssms sql-delete


【解决方案1】:

你很亲密,只需要最后删除员工:

ALTER PROCEDURE [dbo].[RemoveEmployee]
(
    @EmpID int
)
AS
BEGIN
    DELETE FROM EmployeeBankInformation WHERE EmpID = @EmpID
    DELETE FROM EmployeeEducation WHERE EmpID = @EmpID
    DELETE FROM Employee WHERE EmpID = @EmpID
END

【讨论】:

  • 也许将它们包装在事务中......
  • 或者至少将XACT_ABORT设置为ON
  • 如果它有效,@SyedMuhammadAousajaAli,你应该接受这个答案作为解决方案,让未来的读者知道这个答案是有帮助的。
猜你喜欢
  • 2012-10-23
  • 1970-01-01
  • 1970-01-01
  • 2021-03-25
  • 1970-01-01
  • 2014-06-06
  • 1970-01-01
  • 2011-04-16
相关资源
最近更新 更多