Postgres的BIGSERIAL在使用多个远程fdw源进行插入时不共享序列。

3

我正在尝试使用Foreign Data Wrappers从另外两个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 ... ;

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

空值违反了“dummy_pk”列上的非空约束条件

因此,我认为源服务器向目标发送了一个查询,在该查询中dummy_pk为空,而目标没有将其替换为默认值。
那么,有没有一种方法可以强制在源上执行的查询使用目标的序列?也许我必须共享该序列,我可以创建一个外部序列吗?由于我需要读取这些外部表,所以无法删除外部表上的列。
谢谢!
1个回答

5
从外键表中删除“dummy_pk”,以便目标表不会获取NULL值,而是返回默认值或NULL(如果没有指定默认值)。如果您尝试将DEFAULT传递到外部表,则它将尝试使用外部表的DEFAULT值。请保留HTML标记。
create foreign table dummy (
  /*dummy_pk bigserial,*/
  column1 text,
  column2 int2,
  -- other fields
) server ... ;

另一种方法是使用 dblink 从目标服务器中获取序列值,但我认为这种方式更好(如果可以从外键表中删除此列的话)。

谢谢你的回答。我需要在其他查询中使用那个列。我能在同一台服务器上引用相同远程表的情况下创建两个外键表吗?我可以创建一个没有主键的表,另一个有主键的表吗? - undefined
是的,只需在目标服务器中指定架构和/或表名(如果它们不同的话),并且如果您有“重复”的外部表,则必须这样做。OPTIONS (schema_name 'some_schema', table_name 'some_name') - undefined
是的,我已经做了,尽管它们有相同的名称,只是为了确保,谢谢。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接