我收到错误“DELETE 语句与 REFERENCE 约束冲突”

Posted

技术标签:

【中文标题】我收到错误“DELETE 语句与 REFERENCE 约束冲突”【英文标题】:I got error "The DELETE statement conflicted with the REFERENCE constraint" 【发布时间】:2011-04-16 03:09:40 【问题描述】:

我尝试用外键截断表并得到消息:

无法截断表,因为它被 FOREIGN KEY 约束引用”。

我阅读了很多关于这个问题的文献,并认为我通过删除找到了解决方案

DELETE FROM table_name DBCC CHECKIDENT (table_name, RESEED, 0)

但我仍然收到一条错误消息:

DELETE 语句与 REFERENCE 约束冲突”。

当我尝试使用 Microsoft Management Studio 删除并执行上一个查询时

DELETE FROM table_name DBCC CHECKIDENT (table_name, RESEED, 0)

它不会出错并且可以正常工作。我想从表中删除所有信息并向其中添加新信息,但我不想删除和创建外键。

【问题讨论】:

【参考方案1】:

该错误意味着您在其他表中的数据引用了您尝试删除的数据。

您需要删除并重新创建约束或删除外键引用的数据。

假设您有以下表格

dbo.Students
(
StudentId
StudentName
StudentTypeId
)


dbo.StudentTypes
(
StudentTypeId
StudentType
)

假设在StudentTypesStudentTypeId 列和StudentsStudentTypeId 列之间存在外键约束

如果您尝试删除StudentTypes 中的所有数据,则会出现错误,因为Students 中的StudentTypeId 列引用了StudentTypes 表中的数据。

编辑:

DELETETRUNCATE 本质上做同样的事情。唯一的区别是TRUNCATE 不会将更改保存到日志文件中。您也不能将WHERE 子句与TRUNCATE 一起使用

至于为什么你可以在 SSMS 中运行它而不是通过你的应用程序。我真的看不到这种情况发生。无论事务来自何处,FK 约束仍然会引发错误。

【讨论】:

谢谢,我会尝试先删除“子”表,然后再删除主表。如果我使用 TRUNCATE 而不是 DELETE,它会起作用吗?你能告诉我为什么在 MS 管理工作室中我可以使用相同的查询从表中删除行,这在我使用应用程序尝试时给了我错误 这远非“唯一的区别”,例如如果有任何引用,就不会发生截断。大多数系统上的事务中不会发生截断。并且截断不能作为存储过程的一部分发生。在大多数系统中,截断必须在单独的批处理中。并且 truncate 不能触发触发器。 @Jon Hanna - 当然,你是对的。我应该详细说明这些差异。也许用“唯一的区别”来表述会产生误导。 在 SQL Server 中,您可以在存储过程中截断和/或作为事务的一部分进行截断。至少在 SSMS 2012 及更高版本中。【参考方案2】:

您是否考虑过在相关的地方申请ON DELETE CASCADE

【讨论】:

【参考方案3】:

您正在尝试删除被另一行(可能在另一个表中)引用的行。

您需要先删除 行(或至少将其外键重新设置为其他内容),否则您最终会得到引用不存在行的行。数据库禁止这样做。

【讨论】:

我解决了我的问题,从“子”表中删除每一行,然后从“父”表中删除所有行。但仍有一些问题 :) 像“当我尝试使用 microsoft management studio 删除并执行上一个查询(例如 DELETE FROM table_name DBCC CHECKIDENT (table_name, RESEED, 0) )时,它没有给出错误工作正常。"【参考方案4】:

要删除而不更改引用,您应该首先删除或以其他方式更改(以适合您的目的的方式)其他表中的所有相关行。

要截断,您必须删除引用。 TRUNCATE 是 DDL 语句(类似于 CREATE 和 DROP)而不是 DML 语句(如 INSERT 和 DELETE),并且不会触发触发器,无论是显式的还是与引用和其他约束相关的触发器。因此,如果在具有引用的表上允许 TRUNCATE,则数据库可能会进入不一致的状态。当 TRUNCATE 是某些系统使用的标准的扩展时,这是一条规则,并且现在已被添加到标准中。

【讨论】:

以上是关于我收到错误“DELETE 语句与 REFERENCE 约束冲突”的主要内容,如果未能解决你的问题,请参考以下文章

我收到以下错误:[GraphQL 错误]:消息:任务

我收到此错误 NSURLErrorDomain 错误 -999

为啥我收到的 jwt 格式错误?

每当我使用“require”这个词时,我都会收到一个错误,如果我尝试使用 relative_require,我也会收到一个错误

为啥我在尝试使用 fetch 连接 Api 时收到“错误请求”错误 400?

为啥我收到此错误,responseSerializationFailed?