Copier de données depuis un fichier csv vers plusieurs tables

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

Responses

Browse pgsql-fr-generale by date

  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