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