我试图用外键截断表并得到消息:
“无法截断表,因为它正被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)
它没有出错并且工作正常。我想从表中删除所有信息并在其中添加新信息,但我不想删除并创建外键。
答案 0 :(得分:46)
错误意味着您在其他表中有数据引用您要删除的数据。
您需要删除并重新创建约束或删除外键引用的数据。
假设您有以下表格
dbo.Students
(
StudentId
StudentName
StudentTypeId
)
dbo.StudentTypes
(
StudentTypeId
StudentType
)
假设StudentTypeId
中的StudentTypes
列与StudentTypeId
中的Students
列之间存在外键约束
如果您尝试删除StudentTypes
中的所有数据,则会StudentTypeId
中的Students
列引用StudentTypes
表中的数据,因此会发生错误。
修改强>
DELETE
和TRUNCATE
基本上做同样的事情。唯一的区别是TRUNCATE
不会将更改保存到日志文件中。另外,您不能在WHERE
TRUNCATE
子句
AS为什么你可以在SSMS中运行它而不是通过你的应用程序运行它。我真的看不到这种情况。无论事务源自何处,FK约束仍会抛出错误。
答案 1 :(得分:12)
您是否考虑过将ON DELETE CASCADE
应用于相关的内容?
答案 2 :(得分:7)
您正在尝试删除另一行(可能在另一个表中)引用的行。
您需要首先删除 行(或者至少将其外键重新设置为其他行),否则您最终会得到一行引用不存在的行。该数据库禁止这样做。
答案 3 :(得分:1)
要删除,而不更改引用,您应首先删除或以其他方式更改(以适合您的方式)其他表中的所有相关行。
要截断您必须删除引用。 TRUNCATE是一个DDL语句(与CREATE和DROP相当)不是DML语句(如INSERT和DELETE),并且不会触发触发器,无论是显式触发器还是与引用和其他约束相关联的触发器。因此,如果在带引用的表上允许TRUNCATE,则数据库可能会处于不一致状态。当TRUNCATE是某些系统使用的标准的扩展时,这是一个规则,并且由标准强制执行,现在它已被添加。