2016-11-15 33 views
0

這是我的查詢的樣子 -如何在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) 

任何人都知道我們如何能夠在不創建物化視圖和編輯我上面寫的第一個查詢中直接實現這一目標?

回答

1

如果列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