我已为我的国家/地区表创建了备份。
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;
但我正在寻找更多的合并方法,而无需从原始表中清除数据。
答案 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
列)示例:
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