在Postgres和自动增量列中进行Upsert

时间:2017-01-18 14:27:18

标签: postgresql auto-increment upsert

我正在尝试找出如何在postgres中将正确的upsert执行到一个表中,该表具有名为“id”的自动增量主键列和“name”列上的唯一键。

问题是源表和目标表位于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

由于“id”列,简单的upsert会出现重复的键冲突。

1 个答案:

答案 0 :(得分: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或两者都有唯一约束。