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

问题描述:

这是我的查询的样子 -如何在postgres中使用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) 

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

如果列id是主键:

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

如果id不是PK,创建一个索引,使其独特的。你的Postgres版本必须是9.5+。

+0

冲突(id)比不存在的地方更快? – Tisha

+0

在大多数情况下,性能应该是相似的,但是在冲突()上可能会慢一点。 – klin