Re: [pgsql-fr-generale] Copier de données depuis un fichier csv vers plusieurs tables

From: Cédric Villemain <cedric(dot)villemain(dot)debian(at)gmail(dot)com>
To: Denis Bitouzé <dbitouze(at)wanadoo(dot)fr>
Cc: pgsql-fr-generale(at)postgresql(dot)org
Subject: Re: [pgsql-fr-generale] Copier de données depuis un fichier csv vers plusieurs tables
Date: 2011-12-02 14:38:01
Message-ID: CAF6yO=3iFbY8xeKXPKgSzqGPZewN_yMG5NpJiS3pqvMMa04FEQ@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-fr-generale

Le 2 décembre 2011 15:22, Denis Bitouzé <dbitouze(at)wanadoo(dot)fr> a écrit :
> 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 ?

à l'aide d'un trigger par exemple ? (en fonction des volumes a
traiter, il est peut-etre souhaitable de retarder les triggers en fin
de transaction, voir DEFERRABLE)

>
> Merci d'avance.
> --
> Denis
>
> --
> Sent via pgsql-fr-generale mailing list (pgsql-fr-generale(at)postgresql(dot)org)
> To make changes to your subscription:
> http://www.postgresql.org/mailpref/pgsql-fr-generale

--
Cédric Villemain +33 (0)6 20 30 22 52
http://2ndQuadrant.fr/
PostgreSQL: Support 24x7 - Développement, Expertise et Formation

In response to

Responses

Browse pgsql-fr-generale by date

  From Date Subject
Next Message Julien Rouhaud 2011-12-02 15:43:35 Re: [pgsql-fr-generale] Copier de données depuis un fichier csv vers plusieurs tables
Previous Message Denis Bitouzé 2011-12-02 14:22:11 Copier de données depuis un fichier csv vers plusieurs tables