我有一张表people
,记录少于100,000,我使用以下内容备份了此表:
create table people_backup as select * from people
我随着时间的推移向我的people
表添加了一些新记录,但最终我想将备份表中的记录合并到people
。不幸的是,我不能简单地DROP
我的桌子,因为我的新记录将丢失!
所以我想使用来自people
的记录更新people_backup
表中的记录,基于他们的主键id
,我找到了两种方法:
大!但是,这两种方法都使用SET
并让我指定要更新的列。不幸的是,我很懒,people
的结构可能会随着时间的推移而改变,而我的CTAS
语句不需要更新,我的更新/合并脚本需要更改,这对我来说感觉不必要的工作
有没有办法合并整行而不必指定列?我看到here未在INSERT
期间指定列将指示SQL按顺序插入值,这里是否可以应用相同的方法,这样安全吗?
注意:表的结构在备份之间不会改变
答案 0 :(得分:2)
鉴于你的桌子很小,你可以简单地
DELETE FROM table t
WHERE EXISTS( SELECT 1
FROM backup b
WHERE t.key = b.key );
INSERT INTO table
SELECT *
FROM backup;
这很慢而且不是特别优雅(特别是如果来自备份的大部分数据都没有改变)但假设两个表中的列匹配,它确实允许您不列出列。就个人而言,我更喜欢写出列名(大概是那些不经常改变的名称),以便我可以做更新。