gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 12:39:47 24 4
gpt4 key购买 nike

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

我首先像这样定义表:

目标数据库:

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 试图插入 id 1,我相信用于每个源外部表的顺序是不同的。我稍微更改了源表,试图让目标表的序列为 id 完成工作:

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

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

NULL value violates NOT NULL constaint on column « dummy_pk »

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

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

谢谢!

最佳答案

从外部表中删除 dummy_pk,这样目标表就不会得到 NULL 或值,因此返回到 DEFAULTNULL 如果没有 DEFAULT 指定。如果您尝试将 DEFAULT 传递给外部表,它将尝试使用外部表的 DEFAULT 值。

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

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

关于sql - 当使用多个远程 fdw 源进行插入时,Postgres BIGSERIAL 不共享序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56473825/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com