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

Pet*_*ter 48 c# sql truncate sql-delete

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

" 无法截断表,因为它正被FOREIGN KEY约束引用 ".

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

DELETE FROM table_name DBCC CHECKIDENT (table_name, RESEED, 0)
Run Code Online (Sandbox Code Playgroud)

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

" DELETE语句与REFERENCE约束冲突 ".

当我尝试使用Microsoft Management Studio删除并执行以前的查询时

DELETE FROM table_name DBCC CHECKIDENT (table_name, RESEED, 0)
Run Code Online (Sandbox Code Playgroud)

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

cod*_*ger 47

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

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

假设您有以下表格

dbo.Students
(
StudentId
StudentName
StudentTypeId
)


dbo.StudentTypes
(
StudentTypeId
StudentType
)
Run Code Online (Sandbox Code Playgroud)

假设StudentTypeId列中StudentTypesStudentTypeId列和列之间存在外键约束Students

如果您尝试删除StudentTypes错误中的所有数据,则会在StudentTypeId列中Students引用StudentTypes表中的数据.

编辑:

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

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

  • 它远非"唯一的区别",例如,如果有任何引用,就不会发生截断.并且在大多数系统上的事务中都不会发生截断.截断不能作为存储过程的一部分发生.并且truncate必须在大多数系统中单独批处理.截断不能触发触发器. (4认同)

ann*_*ata 13

您是否考虑过ON DELETE CASCADE相关申请?


Kon*_*lph 7

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

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