【问题标题】:Restoring table from duplicated in SQL Server从 SQL Server 中的重复表中恢复表
【发布时间】: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


【解决方案1】:

正如我所提到的,这是XY Problem。你认为你想做的和你真正需要做的完全不同。你向我们描述了 Y,但实际上你想做 X。

此答案基于您在下面的评论:

我需要从一个程序中删除其中的一个子集(大约 100k),然后执行一些其他操作,这些可能会失败。如果这些操作失败,我需要恢复已删除的行。我不需要删除所有这些,我只需要将删除的行从备份表中放回原始表中。

这在 SQL Server 中是一件微不足道的事情,您只需要使用事务即可。用非常简单的伪 SQL 术语来说:

BEGIN TRY

    BEGIN TRANSACTION DoWork;

    --Do your logic here

    --Do you need to also ROLLBACK under some scenario?
    IF {Some Boolean Logic}
        ROLLBACK TRANSACTION DoWork;
    ELSE
        COMMIT TRANSACTION DoWork;

END TRY
BEGIN CATCH

    ROLLBACK TRANSACTION DoWork;
    THROW;

END CATCH;

【讨论】:

  • 感谢您的回答!事务不是需要数据库连接保持活动吗?
  • 是的,您可以在单个连接中执行此操作,@user10483669。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-19
  • 2013-02-13
  • 2010-09-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多