2

我有一个people少于 100,000 条记录的表,并且我使用以下方法对该表进行了备份:

create table people_backup as select * from people 

随着时间的推移,我向表中添加了一些新记录people,但最终我想将备份表中的记录合并到people. 不幸的是,我不能简单地DROP使用我的表,因为我的新记录将会丢失!

因此,我想根据主键people使用来自 的记录来更新表中的记录,并且我找到了两种方法来做到这一点:people_backupid

  1. 表合并在一起
  2. 使用某种花哨的相关更新

伟大的!但是,这两种方法都使用SET并让我指定要更新的列。不幸的是,我很懒,结构people可能会随着时间而改变,虽然我的CTAS语句不需要更新,但我的更新/合并脚本需要更改,这对我来说感觉像是不必要的工作。

有没有办法合并整行而不必指定列?我在这里看到,在遗嘱中不指定列INSERT将直接 SQL 按顺序插入值,可以在这里应用相同的方法,这安全吗?

注意:表的结构在备份之间不会改变

4

1 回答 1

2

鉴于您的桌子很小,您可以简单地

DELETE FROM table t
 WHERE EXISTS( SELECT 1
                 FROM backup b
                WHERE t.key = b.key );

INSERT INTO table
  SELECT *
    FROM backup;

这很慢而且不是特别优雅(特别是如果备份中的大部分数据没有更改),但假设两个表中的列匹配,它确实允许您不列出列。就个人而言,我更喜欢写出列名(大概那些不会经常更改),以便我可以进行更新。

于 2015-11-06T15:52:15.120 回答