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

Postgres BIGSERIAL does not share sequence when inserts are made with multiple remote fdw sources

我正在尝试使用外部数据包装器从其他两个 Postgres 数据库插入 Postgres 数据库中的 table。 objective是要有一个自动生成的主键,独立于源,因为会有两个以上。

我首先定义了 tables 是这样的:

目标数据库:

create table dummy (
  dummy_pk bigserial primary key
  -- other fields
);

来源数据库:

create foreign table dummy (
  dummy_pk bigserial
  -- other fields
) server ... ;

只要我只从一个来源插入,这个解决方案就可以正常工作,当我尝试从另一个来源插入时,没有指定 dummy_pk,我收到了这条消息:

Duplicate key (dummy_pk)=(1)

因为 postgres 试图插入 1 的 id,我相信每个来源 foreign table 使用的序列是不同的。我稍微更改了源 tables,试图让目标 table 的序列为 id:

完成工作
create foreign table dummy (
  dummy_pk bigint
  -- other fields
) server ... ;

这次我得到了一个不同的错误:

NULL value violates NOT NULL constaint on column « dummy_pk »

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

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

谢谢!

从外部 table 中删除 dummy_pk,以便目标 table 不会得到 NULL 或值,因此退回到 DEFAULTNULL 如果未指定 DEFAULT。如果您尝试将 DEFAULT 传递给 foreign table,它将尝试使用 foreign table 的 DEFAULT 值。

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

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