如何在 postgres 中使用 dblink 编写这样的查询?

How can write a query like this using dblink in postgres?

我的查询是这样的 -

INSERT INTO localdb_image select * from 
dblink('host=10.1.1.1
 user=user
 password=password
 dbname=oat', 'SELECT e.* FROM image e JOIN archived f ON e.image_id=f.image_id AND e.dd=f.dd') tt(
      id int ,
  drive_id character varying(255) ,
 ) ;

我希望能够再次 运行 此查询,但要检查一行是否已存在,然后不要插入任何内容。如果我再次 运行 此查询,这将不会导致主键已经存在的错误。

我在哪里可以在上面的查询中添加类似的内容?

 WHERE NOT EXISTS (SELECT 1 from localdb_image ei where ei.id = e.id)

我唯一能想到的就是按照以下方式创建物化视图:

create materialized view mv_localdb_image as select * from 
    dblink('host=10.1.1.1
     user=user
     password=password
     dbname=oat', 'SELECT e.* FROM image e JOIN archived f ON e.image_id=f.image_id AND e.dd=f.dd') tt(
          id int ,
      drive_id character varying(255) ,
     ) ;

然后定期刷新。

并在localdb中插入如下:

insert into localdb_image select * from mv_localdb_image mv where not exists (
select 1 from localdb_image ii where ii.id=mv.id)

有谁知道我们如何在不创建物化视图和编辑我上面写的第一个查询的情况下直接实现这一点?

如果列 id 是主键:

-- pseudocode
insert into localdb_image 
select *
from dblink(...) tt (...)
on conflict(id) do nothing;

如果id不是pk,创建一个索引使其唯一。您的 Postgres 版本必须是 9.5+。