2017-01-18 87 views
0

我試圖找出如何做的Postgres正確UPSERT成具有自動增量主要被稱爲「ID」,並在列「名稱」唯一鍵鍵列的表。的Upsert Postgres裏和自動遞增列

的問題是,源和目的表是在2臺獨立的機器,所以我知道什麼是最新的「ID」是對目標表的沒有簡單的方法。

我現在這樣做的方式是將目標表中的數據導入到源表中,檢查最高「id」,更新源數據庫中的表,然後將upsert插入目標表中,但正如你所看到的,它似乎過於複雜。

什麼,我想要做的一個例子是:

源表:

id status name 
1 ok John 
2 open Monica 

目標表:

id status name 
.  .  . 
.  .  . 
44 ok David 
45 open John 

的UPSERT的結果:

id status name 
.  .  . 
.  .  . 
44 ok David 
45 ok John 
46 open Monica 

一個簡單的UPSERT會有重複鍵衝突,由於「ID」列。

+1

你爲什麼不只是插入(狀態,名稱)沒有身份證,因此序列將需要的ID?照顧.. –

回答

0

在目標端,創建一個外部表與postgres_fdw源表。

然後你就可以使用普通

INSERT INTO dest (status, name) 
    SELECT status, name FROM foreign_source 
    ON CONFLICT DO UPDATE 
    SET status = EXCLUDED.status, 
     name = EXCLUDED.name; 

這需要statusname或兩者的唯一約束。

+0

謝謝,看來我確實有一個問題,我的順序,但因爲它我可以將此作爲一個答案幫助具有類似問題的人在插入值中不使用id的重要性 – johan855