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



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

我首先像这样定义表:

目标数据库:

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

来源数据库:

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

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

重复键 (dummy_pk)=(1)

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

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

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

空值违反列«dummy_pk上的非空约束

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

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

谢谢!

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

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

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

相关内容

  • 没有找到相关文章

最新更新