将备份表数据还原到原始表SQL

时间:2015-06-02 15:54:40

标签: sql database oracle plsql backup

我已为我的国家/地区表创建了备份。

create table country_bkp as select * from country;

我应该使用什么SQL将country表恢复到原始状态? 我能做到

insert into country select * from country_bkp;

但它只会有重复的条目,并且可能会失败,因为主键是相同的。

  

是否有用于合并数据的SQL命令?

最后的选择是

DROP TABLE country;
create table country as select * from country_bkp;

但我希望避免这种情况,因为所有grants/permissions都会因此丢失。

其他清洁方式是

delete from country ;
insert into country select * from country_bkp;

但我正在寻找更多的合并方法,而无需从原始表中清除数据。

3 个答案:

答案 0 :(得分:5)

而不是删除表,正如您所指出的那样,会失去所有权限定义,您可以truncate只删除所有数据,然后插入 - 选择旧数据:

TRUNCATE TABLE country;
INSERT INTO country SELECT * FROM county_bkp;

答案 1 :(得分:4)

只有一个从备份表中恢复数据的解决方案是使用随机名重命名原始表,而不是使用原始表名重命名备份表,以防原始表的标识插入为ON。
例如
原始表格 - 发票
备份表 - Invoice_back

现在重命名这些表:

原始表格 - Invoice_xxx
备份表 - 发票

答案 2 :(得分:2)

在我的情况下,INSERT INTO country SELECT * FROM county_bkp;无法正常工作是因为:

  • 由于以下原因,我无法在“主键”列中插入 indentity_insert默认关闭。
  • 我的表有TimeStamp列。

在这种情况下:

  • 允许identity_insert中的OriginalTable
  • 插入查询,其中提到OriginalTable的所有列(不包括TimeStamp列,并在Values中选择BackupTable中的所有列(不包括TimeStamp列)
  • 最后限制OriginalTable中的identity_insert。

示例:

Set Identity_insert OriginalTable ON
    insert into OriginalTable (a,b,c,d,e, ....) --[Exclude TimeStamp Columns here]
    Select a,b,c,d,e, .... from BackupTable --[Exclude TimeStamp Columns here]

    Set Identity_insert OriginalTable Off