当使用多个远程 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 或值,因此退回到 DEFAULT
或 NULL
如果未指定 DEFAULT
。如果您尝试将 DEFAULT
传递给 foreign table,它将尝试使用 foreign table 的 DEFAULT
值。
create foreign table dummy (
/*dummy_pk bigserial,*/
column1 text,
column2 int2,
-- other fields
) server ... ;
另一种方法是使用 dblink
从目标服务器获取序列值,但我认为这样更好(如果你有能力从外部 table 中删除此列)。
我正在尝试使用外部数据包装器从其他两个 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 或值,因此退回到 DEFAULT
或 NULL
如果未指定 DEFAULT
。如果您尝试将 DEFAULT
传递给 foreign table,它将尝试使用 foreign table 的 DEFAULT
值。
create foreign table dummy (
/*dummy_pk bigserial,*/
column1 text,
column2 int2,
-- other fields
) server ... ;
另一种方法是使用 dblink
从目标服务器获取序列值,但我认为这样更好(如果你有能力从外部 table 中删除此列)。