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

时间:2010-09-23 07:42:08

标签: c# sql truncate sql-delete

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

  

无法截断表,因为它正被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)

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

4 个答案:

答案 0 :(得分:46)

错误意味着您在其他表中有数据引用您要删除的数据。

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

假设您有以下表格

dbo.Students
(
StudentId
StudentName
StudentTypeId
)


dbo.StudentTypes
(
StudentTypeId
StudentType
)

假设StudentTypeId中的StudentTypes列与StudentTypeId中的Students列之间存在外键约束

如果您尝试删除StudentTypes中的所有数据,则会StudentTypeId中的Students列引用StudentTypes表中的数据,因此会发生错误。

修改

DELETETRUNCATE基本上做同样的事情。唯一的区别是TRUNCATE不会将更改保存到日志文件中。另外,您不能在WHERE

中使用TRUNCATE子句

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

答案 1 :(得分:12)

您是否考虑过将ON DELETE CASCADE应用于相关的内容?

答案 2 :(得分:7)

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

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

答案 3 :(得分:1)

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

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