无法截断表,因为它是由FOREIGN KEY约束引用的

时间:2012-03-05 11:35:27

标签: sql-server database foreign-keys

即使引用它的表为空,我也会收到以下消息:“无法截断表'dbo.Link',因为它正被FOREIGN KEY约束引用”似乎没有多大意义为什么会发生这种情况。有什么建议吗?

5 个答案:

答案 0 :(得分:12)

在SQL Server中,即使所有引用表都为空或禁用了外键,FK引用的表当前也无法截断。

您需要使用DELETE(可能需要更多日志记录)或在使用TRUNCATE之前删除关系,然后重新创建它们或查看this connect item上的变通办法使用ALTER TABLE ... SWITCH

实现此目的的方法

答案 1 :(得分:4)

您无法截断对其具有FK约束的表。作为解决方法,您可以: 1 /删除约束 2 / Trunc表 3 /重新创建约束。

这是相关的T-SQL脚本,假设您有两个名为 MyTable MyReferencedTable 的表:

-- Remove constraint
IF EXISTS(SELECT 1 FROM sys.foreign_keys WHERE name = 'FK_MyReferencedTable_MyTable')
BEGIN
    ALTER TABLE dbo.MyReferencedTable
    DROP CONSTRAINT FK_MyReferencedTable_MyTable
END


-- Truncate table
TRUNCATE TABLE dbo.MyTable


-- Re-Add constraint
IF NOT EXISTS(SELECT 1 FROM sys.foreign_keys WHERE name = 'FK_MyReferencedTable_MyTable')
BEGIN
    ALTER TABLE dbo.MyReferencedTable
    WITH CHECK ADD CONSTRAINT [FK_MyReferencedTable_MyTable] FOREIGN KEY(ListingKey)
    REFERENCES dbo.MyTable (ListingKey)
END

答案 2 :(得分:3)

执行以下查询以搜索任何约束:

use MyDatabase
select c.name as c_name, t.name as t_name
from sys.key_constraints c
join sys.tables t on t.object_id = c.parent_object_id

如果您的桌子上有任何约束,请将其删除。

答案 3 :(得分:1)

如果您收到此错误并且需要截断表格,则替代解决方案可能是您可以删除并重新创建表格以及primary/other_keys/indexes/triggers。请确保您不需要该表中的数据。

对我而言,这种疗法对我来说很有吸引力,而且几乎没有花一分钟时间完成。我这样做是为了屏蔽目的。

答案 4 :(得分:-3)

我更喜欢这种更简单的方法,而不是删除或重新创建约束。 首先执行以下查询禁用约束验证:

SET FOREIGN_KEY_CHECKS=0;

然后截断您的表格

最后,重新激活约束验证:

SET FOREIGN_KEY_CHECKS=1;

这是迁移数据库时的常用解决方案,因此您不必担心表格的插入顺序。