Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 在Postgres和auto increment列中向上插入_Postgresql_Auto Increment_Upsert - Fatal编程技术网

Postgresql 在Postgres和auto increment列中向上插入

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

我试图找出如何在postgres中正确地向上插入到一个表中,该表有一个名为“id”的自动递增主键列和一个名为“name”的唯一键

问题是源表和目标表在两台独立的机器上,因此我无法轻松地知道目标表上最新的“id”是什么

我现在的做法是将数据从目标表导入源表,检查最高的“id”,更新源数据库中的表,然后向目标表中进行upsert,但正如您所看到的,这似乎过于复杂

我想做的一个例子是:

源表:

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的重要性