Postgres:更新另一个表中的所有列

时间:2014-04-24 20:19:07

标签: sql postgresql psql

我需要更新另一个表,我需要更新所有列,我的问题是,除了列出SET中的每一列之外,还有一种方法可以像这样更新它们:< / p>

update tableA
set * = tableB.*
from tableB where tableA.id = tableB.id

我在psql中尝试过,它不起作用..我必须列出这样的每一列:

update tableA
set c1 = tableB.c1, c2 = tableB.c2, ...
from tableB where tableA.id = tableB.id

使用create..like tableA创建tableB。所以它们基本相同。我之所以这样做,是因为我需要将.csv数据加载到临时表tableB,然后根据tableB中的新数据更新tableA。 tableA需要尽可能少地锁定,tableA需要保持完整性。我不确定&#39;删除然后插入&#39;会是一个不错的选择吗?

谢谢!

2 个答案:

答案 0 :(得分:1)

如果两个表具有相同顺序的相同列,则可以删除并重新插入。假设tableB中的所有记录都匹配tableA:

delete from tableA
    where id in (select id from tableB)

insert into tableA
    select *
    from tableB;

(如果所有记录都不匹配,您可以使用临时表来保留必要的ID。)

通常,我反对在没有列列表的情况下执行insert。在某些情况下,它是可以容忍的 - 例如tableB使用tableB创建*作为{{1}}的子集时。

答案 1 :(得分:0)

取决于您的用例,并会导致锁定,但类型不同。适用于某些场景的方法。

BEGIN;
    DROP TABLE IF EXISTS tableA_old;
    ALTER tableA RENAME TO tableA_old;
    ALTER tableB RENAME TO tableA;
COMMIT;