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

时间:2016-11-15 08:33:32

标签: postgresql unique archive upsert dblink

这是我查询的外观 -

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)

任何人都知道如何在不创建物化视图和编辑我上面写的第一个查询的情况下直接实现这一目标吗?

1 个答案:

答案 0 :(得分:1)

如果列id是主键:

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

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