2016-11-15 1 views
0

Voici comment ma requête ressemble -Comment écrire une requête comme celle-ci en utilisant dblink dans 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) , 
) ; 

Je veux être en mesure d'exécuter cette requête à nouveau mais il faut vérifier si une ligne existe déjà, ne pas insérer quoi que ce soit. Cela résultera en aucune erreur de clé primaire déjà présente si j'exécute à nouveau cette requête.

Où puis-je ajouter quelque chose comme ça dans la requête ci-dessus?

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

La seule chose que je peux penser à faire est simplement de créer une vue matérialisée de la manière suivante:

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) , 
    ) ; 

, puis rafraîchissez périodiquement.

et l'insérer dans le localdb comme suit:

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

Quelqu'un sait comment nous pouvons y parvenir directement sans créer une vue matérialisée et l'édition de la première requête que j'ai écrit ci-dessus?

Répondre

1

Si la colonne id est une clé primaire:

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

Si id est pas pk, créer un index pour le rendre unique. Votre version Postgres doit être 9.5+.

+0

Est-il en conflit (id) plus rapide que lorsqu'il n'existe pas? – Tisha

+0

Dans la plupart des cas, les performances doivent être similaires, mais 'sur conflict()' peut être un peu plus lent. – klin