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?
Est-il en conflit (id) plus rapide que lorsqu'il n'existe pas? – Tisha
Dans la plupart des cas, les performances doivent être similaires, mais 'sur conflict()' peut être un peu plus lent. – klin