我收到错误“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
)
假设在StudentTypes
的StudentTypeId
列和Students
的StudentTypeId
列之间存在外键约束
如果您尝试删除StudentTypes
中的所有数据,则会出现错误,因为Students
中的StudentTypeId
列引用了StudentTypes
表中的数据。
编辑:
DELETE
和 TRUNCATE
本质上做同样的事情。唯一的区别是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 约束冲突”的主要内容,如果未能解决你的问题,请参考以下文章
我收到此错误 NSURLErrorDomain 错误 -999
每当我使用“require”这个词时,我都会收到一个错误,如果我尝试使用 relative_require,我也会收到一个错误