1

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

我首先像这样定义表:

目标数据库:

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 ... ;

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

NULL 值违反了 «dummy_pk » 列上的 NOT NULL 约束

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

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

谢谢!

4

1 回答 1

3

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

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

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

于 2019-06-06T09:30:28.120 回答