我需要更新另一个表,我需要更新所有列,我的问题是,除了列出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;会是一个不错的选择吗?
谢谢!
答案 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;