Postgresql 在Postgres和auto increment列中向上插入
我试图找出如何在postgres中正确地向上插入到一个表中,该表有一个名为“id”的自动递增主键列和一个名为“name”的唯一键 问题是源表和目标表在两台独立的机器上,因此我无法轻松地知道目标表上最新的“id”是什么 我现在的做法是将数据从目标表导入源表,检查最高的“id”,更新源数据库中的表,然后向目标表中进行upsert,但正如您所看到的,这似乎过于复杂 我想做的一个例子是: 源表:Postgresql 在Postgres和auto increment列中向上插入,postgresql,auto-increment,upsert,Postgresql,Auto Increment,Upsert,我试图找出如何在postgres中正确地向上插入到一个表中,该表有一个名为“id”的自动递增主键列和一个名为“name”的唯一键 问题是源表和目标表在两台独立的机器上,因此我无法轻松地知道目标表上最新的“id”是什么 我现在的做法是将数据从目标表导入源表,检查最高的“id”,更新源数据库中的表,然后向目标表中进行upsert,但正如您所看到的,这似乎过于复杂 我想做的一个例子是: 源表: id status name 1 ok John 2 open Monica id sta
id status name
1 ok John
2 open Monica
id status name
. . .
. . .
44 ok David
45 open John
id status name
. . .
. . .
44 ok David
45 ok John
46 open Monica
目的地表:
id status name
1 ok John
2 open Monica
id status name
. . .
. . .
44 ok David
45 open John
id status name
. . .
. . .
44 ok David
45 ok John
46 open Monica
插入的结果:
id status name
1 ok John
2 open Monica
id status name
. . .
. . .
44 ok David
45 open John
id status name
. . .
. . .
44 ok David
45 ok John
46 open Monica
由于“id”列的原因,简单的upsert将有重复的键冲突。在目标端,使用postgres\u fdw为源表创建一个外部表 然后你可以用普通的
INSERT INTO dest (status, name)
SELECT status, name FROM foreign_source
ON CONFLICT DO UPDATE
SET status = EXCLUDED.status,
name = EXCLUDED.name;
这需要对
状态
或名称
或两者都有唯一的约束。为什么不插入没有id的(状态、名称),这样序列就可以处理id?。谢谢,似乎我的序列确实有问题,但我将此设置为一个答案,因为它可以帮助任何有类似问题的人了解在插入值中不使用id的重要性