From: | Denis Bitouzé <dbitouze(at)wanadoo(dot)fr> |
---|---|
To: | pgsql-fr-generale(at)postgresql(dot)org |
Subject: | Copier de données depuis un fichier csv vers plusieurs tables |
Date: | 2011-12-02 14:22:11 |
Message-ID: | 20111202152211.2bc8212d@wanadoo.fr |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-fr-generale |
Bonjour,
la question que je me pose est peut-être un FAQ mais je ne parviens pas
à trouver de réponse.
Schématiquement, je souhaite à partir d'un fichier .csv, d'une pierre
deux coups :
1. ajouter, au moyen de la commande COPY, des données à une table T1 ;
2. remplir une table de jointure T3 entre T1 et une table T2 pour
indiquer à quel élément de T2 sont liées les données qui
viennent d'être ajoutées à T1.
Pour fixer les idées, mon cas d'utilisation est le suivant : je dispose
de 3 tables :
1. « etudiants » contenant différents étudiants, chacun caractérisé
par ses nom et prénom :
select * from etudiants where 0=1;
id_etu | nom_etu | prenom_etu
--------+---------+------------
2. « promotions » contenant les différentes promotions auxquelles les
étudiants appartiennent ou ont appartenu (caractéristiques sans
intérêt ici) :
select id_promotion from promotions where 0=1;
id_promotion
--------------
3. une table de jointure « etudiants_promotions » entre les 2 tables
précédentes pour indiquer à quelle(s) promotion(s) un étudiant donné
appartient ou a appartenu :
select * from etudiants_promotions where 0=1;
id_etu_promo | id_etu | id_promotion
--------------+--------+--------------
Pour faciliter l'inscription des étudiants (d'une promotion donnée) dans
la table « etudiants », je dispose d'un fichier etudiants.csv contenant
schématiquement :
nom_etudiant_1,prenom_etudiant_1
nom_etudiant_2,prenom_etudiant_2
nom_etudiant_3,prenom_etudiant_3
nom_etudiant_4,prenom_etudiant_4
nom_etudiant_5,prenom_etudiant_5
que je compte utiliser ainsi :
COPY etudiants(nom,prenom) FROM '/home/bitouze/etudiants.csv' WITH
DELIMITER ',';
Le problème est que, sachant que les étudiants en question vont
appartenir à une promotion donnée (disons id_promotion = 42), j'aurais
aimé également pouvoir faire d'une pierre deux coups en remplissant en
même temps la table de jointure « etudiants_promotions ».
Bien sûr, je pourrais a posteriori faire quelque chose du genre :
INSERT INTO etudiants_promotions (id_etu,id_promotion) SELECT
id_etudiant,42 from etudiants where
nom_etu = nom_etudiant_1 AND prenom_etu = prenom_etudiant_1
et ainsi de suite pour chacun des étudiants mais :
1. c'est lourd ;
2. c'est surtout bogogène en cas d'homonymie.
Auriez-vous une idée pour gérer efficacement ce genre de situation ?
Merci d'avance.
--
Denis
From | Date | Subject | |
---|---|---|---|
Next Message | Cédric Villemain | 2011-12-02 14:38:01 | Re: [pgsql-fr-generale] Copier de données depuis un fichier csv vers plusieurs tables |
Previous Message | Dimitri Fontaine | 2011-12-02 14:03:34 | Re: Rencontre parisienne d'hier soir |