2017-09-19 7 views
0

Je suis en train d'importer un fichier csv dans la table postgres où je peux faire avec succès si l'aide COPIE DE:PSQL - Copie du fichier csv si l'article de la colonne n'existe pas

import.sql

\copy myTable FROM '..\CSV_OUTPUT.csv' DELIMITER ',' CSV HEADER; 

Mais cette requête ajoute uniquement des lignes si elle n'est pas actuellement dans la base de données, sinon elle se ferme avec une erreur. La clé (id) = (#) existe déjà.

myTable

id | alias | address    
------+-------------+--------------- 
    11 | red_foo | 10.1.1.11 
    12 | blue_foo | 10.1.1.12 

CSV_OUTPUT.csv

id | alias | address    
------+-------------+--------------- 
    10 | black_foo | 10.1.1.11 
    12 | blue_foo | 10.1.1.12 
    13 | grey_foo | 10.1.1.13 
    14 | pink_foo | 10.1.1.14 

Ma sortie désirée est d'insérer les lignes du fichier csv dans postgresql si adresse n'existe pas. myTable devrait déjà contenir grey_foo et pink_foo mais pas black_foo puisque son adresse existe déjà.

Quelles devraient être les bonnes requêtes à utiliser pour y parvenir? Vos suggestions et idées sont très appréciées.

Répondre

2

Copiez les données dans une table de transfert, puis mettez à jour votre table principale (myTable) avec uniquement les lignes avec les clés qui n'existent pas déjà. Par exemple, en supposant que vous avez importé les données dans une table nommée staging:

with nw as (
    select s.id, s.alias, s.address 
    from staging as s 
    left join mytable as m on m.address=s.address 
    where m.address is null 
    ) 
insert into mytable 
    (id, alias, address) 
select id, alias, address 
from nw; 

Si vous pouvez passer à Postgres 9.5, vous pouvez utiliser à la place une commande INSERT avec la clause ON CONFLICT DO NOTHING.