2016-11-15 19 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が主キーの場合:PKではない

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

id場合は、それを一意にするためにインデックスを作成します。 Postgresのバージョンは9.5以上でなければなりません。

+0

競合(id)は存在しない場合よりも速くですか? – Tisha

+0

ほとんどの場合、パフォーマンスは似ているはずですが、 'on conflict()'は少し遅いかもしれません。 – klin

関連する問題