Postgres 中的 Upsert 和自动增量列

Upsert in Postgres and auto increment column

我正在尝试找出如何在 postgres 中将正确的更新插入到 table 中,该 table 具有一个名为 "id" 的自动递增主键列和该列上的唯一键 "name".

问题是源和目标 table 在两台不同的机器上,所以我没有简单的方法知道目标 table 上最新的 "id" 是什么.

我现在的做法是将数据从目标 table 导入源,检查最高 "id",更新源中的 table数据库,然后将更新插入到目标 table,但如您所见,它似乎过于复杂。

我想做的一个例子是:

来源table:

id status name
1    ok   John
2    open Monica

目的地table:

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

upsert 的结果:

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

由于 "id" 列,简单的 upsert 将出现重复键冲突。

在目标端,使用 postgres_fdw 为源 table 创建一个外部 table。

那么你可以使用正则

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

这需要 statusname 或两者的唯一约束。