2014-04-24 41 views
0

我需要從另一個表更新表,我需要更新所有列,我的問題是,除了列出SET中的每一列,有沒有辦法更新它們全部像這樣:Postgres:更新從另一個表中的所有列

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 

tableB的使用create..like TABLEA。所以它們基本相同。我這樣做的原因是我需要將.csv數據加載到臨時表tableB,然後根據tableB中的新數據更新tableA。 tableA需要儘可能少地鎖定,tableA需要保持完整性。我不確定'刪除然後插入'會是一個不錯的選擇嗎?

謝謝!

回答

1

如果兩個表具有相同順序的相同列,您可以刪除並重新插入。假設TableB中匹配表A中的所有記錄:

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

insert into tableA 
    select * 
    from tableB; 

(如果所有記錄不匹配,你可以使用一個臨時表,以保持必要的ID)

一般情況下,我反對這樣做insert沒有列名單。在某些情況下,這是可以接受的 - 例如,當使用*tableB創建爲tableB的子集時。

+0

謝謝@Gordon Linoff,實際上tableB是使用create..like tableA創建的。所以它們基本相同。我這樣做的原因是我需要將.csv數據加載到臨時表tableB,然後根據tableB中的新數據更新tableA。 tableA需要儘可能少地鎖定,tableA需要保持完整性。我不確定刪除會是一個不錯的選擇嗎?謝謝! – odieatla

+0

@odieatla。 。 。您的評論在原始問題中添加了一大堆要求。你可能會考慮問一個更詳細的解釋,你想要做什麼。這個問題似乎是爲了不在查詢中輸入大量列名,而不是爲了避免鎖定而採取某種最佳方式的更深層次的問題。順便說一句,後續問題可能更適合於dba.stackexchange.com,比這個網站更適合。 –

+0

感謝您的指導!我會在那裏發佈它,並更新我的問題。 – odieatla

0

取決於您的用例,並且會導致不同類型的鎖。適用於某些情況的方法。

BEGIN; 
    DROP TABLE IF EXISTS tableA_old; 
    ALTER tableA RENAME TO tableA_old; 
    ALTER tableB RENAME TO tableA; 
COMMIT; 
相關問題