【发布时间】:2020-10-01 14:15:13
【问题描述】:
在 SQL Server 中,我正在使用下面的查询创建一个备份表,这为我提供了名为 Backup 的表 Original 的副本:
select *
into Backup
from Original
如何使用我的Backup 表将所有数据恢复到Original(包括id)?
原始表包含约 20 列,并且有 1 个或多个外键指向其 id。
Original 中的一些条目可能已被删除,没有添加新条目。
我正在考虑做类似的事情:
TRUNCATE TABLE Original
SET IDENTITY_INSERT Original ON;
INSERT INTO Original (id, val1, val2,....)
SELECT id, val1, val2,....
FROM Backup;
SET IDENTITY_INSERT Original OFF;
但是我不能截断被外键引用的表,并且在不清空表的情况下,INSERT 可以运行到重复的 id 中
有人可以帮我解决这个问题吗?
【问题讨论】:
-
这感觉就像XY Problem。如果该列是主键,由外键引用,那么您为什么想要删除所有这些行?这样做会在其他表中创建孤立的行,或者由于级联而将它们全部删除。您真正想在这里实现什么目标?
-
为什么不使用真正的备份?
-
将密钥编写为 drop 和 create,并在截断之前运行 drop,然后重新应用密钥。正如@lamu 所说,无论如何删除键值都存在潜在的陷阱,因此在运行之前请注意您希望数据的外观!
-
@Larnu 从一个程序中我需要删除它们的一个子集(大约 100k)然后执行一些其他操作,这些可能会失败。如果这些操作失败,我需要恢复已删除的行。我不需要删除所有这些,我只需要将删除的行从备份表中放回原始表中。
-
那么,你所追求的就是
TRANSACTION。 你正在尝试做的正是我所怀疑的,一个 XY 问题。
标签: sql sql-server database-backups