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



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

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

您需要使用DELETE(可能需要更多的日志记录),或者在使用TRUNCATE之前删除关系,然后重新创建它们,或者查看此连接项上的解决方法,以了解使用ALTER TABLE ... SWITCH 实现这一点的方法

不能截断带有FK约束的表。作为解决方法,您可以:1/删除约束2/截断表格3/重新创建约束。

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

-- 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

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

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

如果在您的表上发现任何约束,请将其删除。

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

对我来说,这种深情就像一种魅力,几乎没花一分钟就结束了。我这么做是为了掩饰。

不适用于SQL Server,仅适用于MySQL。

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

SET FOREIGN_KEY_CHECKS=0;

然后截断您的表

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

SET FOREIGN_KEY_CHECKS=1;

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

最新更新