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

Sql 当使用多个远程fdw源进行插入时,Postgres BIGSERIAL不共享序列,sql,postgresql,primary-key,postgres-fdw,Sql,Postgresql,Primary Key,Postgres Fdw,我正在尝试使用外部数据包装器从另外两个Postgres数据库插入到Postgres数据库的表中。目标是拥有一个独立于源的自动生成主键,因为在中会有两个以上的主键 我首先定义了如下表: 目标数据库: createtabledummy( 伪pk bigserial主键 --其他领域 ); 资料来源数据库: createforeigntabledummy( 伪序列 --其他领域 )服务器; 只要我只从一个源插入,这个解决方案就可以正常工作,当我尝试从另一个源插入时,没有指定dummy_pk,我得到

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

我首先定义了如下表:

目标数据库:
createtabledummy(
伪pk bigserial主键
--其他领域
);
资料来源数据库:
createforeigntabledummy(
伪序列
--其他领域
)服务器;
只要我只从一个源插入,这个解决方案就可以正常工作,当我尝试从另一个源插入时,没有指定dummy_pk,我得到以下消息:

重复密钥(伪密钥)=(1)

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

createforeigntabledummy(
伪pk bigint
--其他领域
)服务器;
这次我得到了一个不同的错误:

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

因此,我相信源服务器会向目标发送一个查询,其中dummy_pk为null,并且目标不会用默认值替换它

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


谢谢

从外部表中删除
dummy\u pk
,这样目标表就不会得到NULL或值,因此如果未指定
默认值,则返回到
DEFAULT
NULL
。如果您试图将
DEFAULT
传递到外部表,它将尝试使用外部表的
DEFAULT

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

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

感谢您的支持。我需要在其他查询中使用该列。我是否可以在引用同一服务器中的同一远程表时创建两个外部表?我可以创建一个没有pk的,一个有?是的,只要在目标服务器中指定模式和/或表名,如果它们不同(如果您有“dupliate”外部表,则必须指定它们)
选项(模式名“some\u schema”,表名“some\u name”)
是的,即使它们有相同的名称,也已经指定了,只是为了确保,谢谢。