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

Ani*_*kur 4 sql database oracle backup plsql

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

create table country_bkp as select * from country;
Run Code Online (Sandbox Code Playgroud)

我应该用什么SQL将country表恢复到原始状态?我可以

insert into country select * from country_bkp;
Run Code Online (Sandbox Code Playgroud)

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

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

最后的选择是

DROP TABLE country;
create table country as select * from country_bkp;
Run Code Online (Sandbox Code Playgroud)

但我想避免这种情况,因为所有人grants/permissions都会因此而迷失方向.

其他更干净的方式

delete from country ;
insert into country select * from country_bkp;
Run Code Online (Sandbox Code Playgroud)

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

Mur*_*nik 7

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

TRUNCATE TABLE country;
INSERT INTO country SELECT * FROM county_bkp;
Run Code Online (Sandbox Code Playgroud)


SU7*_*SU7 5

就我而言,INSERT INTO country SELECT * FROM county_bkp;没有用,因为:

  • 由于默认情况下处于关闭状态,它不允许我插入主键列 indentity_insert
  • 我的桌子有TimeStamp列。

在这种情况下:

  • 允许identity_insertOriginalTable
  • 插入查询,其中提及OriginalTable(排除TimeStamp列)的所有列,并从(排除列)Values中选择所有列BackupTableTimeStamp
  • 将 Identity_insert 限制在 OriginalTable 最后。

例子:

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
Run Code Online (Sandbox Code Playgroud)