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;
这需要 status
或 name
或两者的唯一约束。
我正在尝试找出如何在 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;
这需要 status
或 name
或两者的唯一约束。