The*_*ler 3 sql postgresql primary-key postgres-fdw
我正在尝试使用外部数据包装器将其他两个 Postgres 数据库插入到 Postgres 数据库中的表中。目标是拥有一个独立于源的自动生成主键,因为将有两个以上的主键。
\n我首先像这样定义表:
\ncreate table dummy (\n dummy_pk bigserial primary key\n -- other fields\n);\nRun Code Online (Sandbox Code Playgroud)\ncreate foreign table dummy (\n dummy_pk bigserial\n -- other fields\n) server ... ;\nRun Code Online (Sandbox Code Playgroud)\n只要我仅从一个源插入,此解决方案就可以正常工作,当我尝试从另一个源插入而不指定 dummy_pk 时,我收到以下消息:
\n\n\n重复密钥 (dummy_pk)=(1)
\n
因为 postgres 尝试插入 id 1,所以我相信每个源外部表使用的序列是不同的。我对源表做了一些更改,试图让目标表的序列完成 id 的工作:
\ncreate foreign table dummy (\n dummy_pk bigint\n -- other fields\n) server ... ;\nRun Code Online (Sandbox Code Playgroud)\n这次我遇到了不同的错误:
\n\n\nNULL 值违反列 \xc2\xab dummy_pk \xc2\xbb 上的 NOT NULL 约束
\n
因此,我相信源服务器向目标发送查询,其中 dummy_pk 为空,并且目标不会将其替换为默认值。
\n那么,有没有一种方法可以强制在源上执行的查询中使用目标的序列?也许我必须共享该序列,我可以创建一个外国序列吗?我无法删除外部表上的列,因为我需要对它们进行读取访问。
\n谢谢!
\n从外部表中删除dummy_pk,以便目标表不会获得 NULL 或值,因此如果未指定,则回退到DEFAULTor 。如果您尝试传递到外表,它将尝试使用外表的值。NULLDEFAULTDEFAULTDEFAULT
create foreign table dummy (
/*dummy_pk bigserial,*/
column1 text,
column2 int2,
-- other fields
) server ... ;
Run Code Online (Sandbox Code Playgroud)
另一种方法是使用从目标服务器获取序列值dblink,但我认为这更好(如果您有能力从外部表中删除此列)。