我得到错误“DELETE语句与参考约束冲突”
我试图用外键截断一个表,并得到消息:
“ 不能截断表,因为它被FOREIGN KEY约束引用 ”。
我读了很多有关这个问题的文献,并认为我通过使用deletefind了解决scheme
DELETE FROM table_name DBCC CHECKIDENT (table_name, RESEED, 0)
但是我仍然收到错误信息:
“ DELETE语句与参考约束冲突 ”。
当我尝试使用Microsoft Management Studio删除并执行以前的查询时
DELETE FROM table_name DBCC CHECKIDENT (table_name, RESEED, 0)
它不会给出错误并正常工作。 我想删除表中的所有信息并添加新的信息,但是我不想删除并创build外键。
该错误意味着您在其他表中的数据引用了您要删除的数据。
您需要删除并重新创build约束或删除外键引用的数据。
假设你有下面的表格
dbo.Students ( StudentId StudentName StudentTypeId ) dbo.StudentTypes ( StudentTypeId StudentType )
假设StudentTypeId
中的StudentTypeId
列和Students
的StudentTypeId
列之间存在外键约束
如果您尝试删除StudentTypes
的所有数据,则会发生错误,因为StudentTypeId
中的StudentTypeId
列会引用StudentTypes
表中的数据。
编辑:
DELETE
和TRUNCATE
基本上做同样的事情。 唯一的区别是TRUNCATE
不会将更改保存到日志文件中。 你也不能在TRUNCATE
使用WHERE
子句
至于为什么你可以在SSMS中运行,而不是通过你的应用程序。 我真的看不到这一切发生。 无论事务源自何处,FK约束仍将引发错误。
你有没有考虑在相关的地方应用ON DELETE CASCADE
?
您试图删除另一行(可能在另一个表中)引用的行。
您需要首先删除该行(或者至less将其外键重新设置为别的东西),否则最终会引用一个引用不存在的行的行。 数据库禁止这一点。
要删除而不更改引用,您应该先删除或以其他方式更改(以适合您的目的的方式)其他表中的所有相关行。
要切断,您必须删除引用。 TRUNCATE是DDL语句(类似于CREATE和DROP)而不是DML语句(如INSERT和DELETE),不会导致触发器(无论是显式还是与引用和其他约束关联)触发。 因此,如果在带引用的表上允许使用TRUNCATE,则可能会将数据库置于不一致状态。 当TRUNCATE是某些系统所使用的标准的扩展时,这是一个规则,并且由该标准规定,现在已被添加。