【问题标题】:Upsert in Postgres and auto increment column在 Postgres 和自动增量列中插入
【发布时间】:2017-01-18 14:27:17
【问题描述】:

我正在尝试找出如何在 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 会有重复的键冲突。

【问题讨论】:

  • 为什么不直接插入 (status, name) 而不是 id,所以序列会处理 id?..

标签: postgresql auto-increment upsert


【解决方案1】:

在目标端,使用 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 或两者都有唯一的约束。

【讨论】:

  • 谢谢,看来我的序列实际上有问题,但我将此设置为答案,因为它可以帮助任何有类似问题的人了解在插入值中不使用 id 的重要性
猜你喜欢
  • 1970-01-01
  • 2012-02-24
  • 1970-01-01
  • 2012-04-08
  • 2016-11-06
  • 2011-08-23
  • 2014-11-06
  • 1970-01-01
相关资源
最近更新 更多