2017-01-18 57 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