当使用多个远程 fdw 源进行插入时,Postgres BIGSERIAL 不共享序列

The*_*ler 3 sql postgresql primary-key postgres-fdw

我正在尝试使用外部数据包装器将其他两个 Postgres 数据库插入到 Postgres 数据库中的表中。目标是拥有一个独立于源的自动生成主键,因为将有两个以上的主键。

\n

我首先像这样定义表:

\n

目标数据库:

\n
create table dummy (\n  dummy_pk bigserial primary key\n  -- other fields\n);\n
Run Code Online (Sandbox Code Playgroud)\n

来源数据库:

\n
create foreign table dummy (\n  dummy_pk bigserial\n  -- other fields\n) server ... ;\n
Run Code Online (Sandbox Code Playgroud)\n

只要我仅从一个源插入,此解决方案就可以正常工作,当我尝试从另一个源插入而不指定 dummy_pk 时,我收到以下消息:

\n
\n

重复密钥 (dummy_pk)=(1)

\n
\n

因为 postgres 尝试插入 id 1,所以我相信每个源外部表使用的序列是不同的。我对源表做了一些更改,试图让目标表的序列完成 id 的工作:

\n
create foreign table dummy (\n  dummy_pk bigint\n  -- other fields\n) server ... ;\n
Run Code Online (Sandbox Code Playgroud)\n

这次我遇到了不同的错误:

\n
\n

NULL 值违反列 \xc2\xab dummy_pk \xc2\xbb 上的 NOT NULL 约束

\n
\n

因此,我相信源服务器向目标发送查询,其中 dummy_pk 为空,并且目标不会将其替换为默认值。

\n

那么,有没有一种方法可以强制在源上执行的查询中使用目标的序列?也许我必须共享该序列,我可以创建一个外国序列吗?我无法删除外部表上的列,因为我需要对它们进行读取访问。

\n

谢谢!

\n

Łuk*_*ski 5

从外部表中删除dummy_pk,以便目标表不会获得 NULL 或值,因此如果未指定,则回退到DEFAULTor 。如果您尝试传递到外表,它将尝试使用外表的值。NULLDEFAULTDEFAULTDEFAULT

create foreign table dummy (
  /*dummy_pk bigserial,*/
  column1 text,
  column2 int2,
  -- other fields
) server ... ;
Run Code Online (Sandbox Code Playgroud)

另一种方法是使用从目标服务器获取序列值dblink,但我认为这更好(如果您有能力从外部表中删除此列)。