60

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

无法截断表,因为它被 FOREIGN KEY 约束引用”。

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

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

4 回答 4

50

该错误意味着您在其他表中的数据引用了您尝试删除的数据。

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

假设您有以下表格

dbo.Students
(
StudentId
StudentName
StudentTypeId
)


dbo.StudentTypes
(
StudentTypeId
StudentType
)

StudentTypeId假设in 列StudentTypesStudentTypeIdin列之间存在外键约束Students

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

编辑:

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

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

于 2010-09-23T07:50:46.883 回答
14

你有没有考虑ON DELETE CASCADE在相关的地方申请?

于 2010-09-23T09:56:26.837 回答
9

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

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

于 2010-09-23T07:46:24.880 回答
2

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

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

于 2010-09-23T09:51:01.843 回答