我正在尝试找出如何在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会出现重复的键冲突。
答案 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;
这需要status
或name
或两者都有唯一约束。