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