即使引用它的表为空,我也会收到以下消息:“无法截断表'dbo.Link',因为它正被FOREIGN KEY约束引用”似乎没有多大意义为什么会发生这种情况。有什么建议吗?
答案 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;
这是迁移数据库时的常用解决方案,因此您不必担心表格的插入顺序。