即使引用它的表为空,我也会收到以下消息:"无法截断表'dbo.Link',因为它正被FOREIGN KEY约束引用"似乎没有太多意义。有什么建议吗?
在SQL Server中,即使所有引用表都为空或外键被禁用,FK引用的表当前也不能被截断。
您需要使用DELETE
(可能需要更多的日志记录),或者在使用TRUNCATE
之前删除关系,然后重新创建它们,或者查看此连接项上的解决方法,以了解使用ALTER TABLE ... SWITCH
实现这一点的方法
不能截断带有FK约束的表。作为解决方法,您可以:1/删除约束2/截断表格3/重新创建约束。
这里是相关的T-SQL脚本,假设您有两个名为MyTable和MySReferencedTable的表:
-- 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;
这是迁移数据库时的常见解决方案,因此您不必担心表的插入顺序。