我在SQL Server 2012数据库中有一个表,该表具有超过3000万行,我需要删除其中的大部分。但是,删除这些行所花费的时间太长(我们正在谈论多天)。
我在网上找到的最可能的解决方案是,我使用SELECT INTO查询来抓取我要保留的所有行并将它们放在临时表中,在使用另一个SELECT INTO语句执行以下操作之前,先删除原始表从临时表重新填充原始表。
但是,我遇到了无法删除原始表的问题,因为它是由外键约束引用的。我使用了以下查询:
SELECT * FROM [sys].[foreign_keys] WHERE referenced_object_id = object_id('OriginalTable')
要获取外键约束,但是当我尝试使用ALTER TABLE OriginalTable NOCHECK CONSTRAINT [约束名称]时,我收到一条消息,指出约束不属于该表。
我的目标是在不更改数据库状态的情况下删除这3000万行,因此我想保持所有外键不变。我要这样做正确吗?如果是这样,如何删除原始表?
答案 0 :(得分:0)
我想出了一个可行的解决方案:
步骤1:我使用SELECT INTO语句将所需的行备份到临时表中。
步骤2:我使用SQL Server Management Studio的“脚本键为”功能为外键约束制作DROP和CREATE sql脚本。
步骤3:我使用创建的脚本删除外键约束。
步骤4:我截断原始表。
步骤5::我使用INSERT INTO语句将临时表中的所有行复制回截断后的原始表中。
步骤6:,我使用创建的脚本重新创建外键约束。
步骤7:我放下了临时表。
我相信这可以有效地删除不需要的行,并使数据库保持与流程开始时相同的状态(当然,请减去不需要的行)。