IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PostgreSQL Discussion :

Enregistrements dans table avec COPY


Sujet :

PostgreSQL

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2009
    Messages : 25
    Points : 13
    Points
    13
    Par défaut Enregistrements dans table avec COPY
    Bonjour à tous !

    J'essaye d'importer des données d'un fichier CSV dans une base PostgreSQL et j'ai quelques difficultées.

    Alors voila mon plan :

    J'envois toutes mes données du fichier CSV dans une table temporaire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    COPY temporaire (Empire, Kingdom, Subkingdom, Infrakingdom, Phylum, Classe, Subclass, Ordre, Family) FROM '/home/yoite/Test_export_vir.csv' WITH CSV;
    Donc la tout se copie comme il faut : "COPY 20"

    Lorsque je fais l'inverse :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     COPY temporaire (Empire, Kingdom, Subkingdom, Infrakingdom, Phylum, Classe, Subclass, Ordre, Family) TO '/home/yoite/Test_export_vir.csv' WITH CSV;
    Ca marche nickel aussi je retrouve bien mon premier fichier.

    Mon problème est après.Je veux pouvoir inserer de facon precise les elements contenu dans la table temporaire dans les autres tables de ma base avec INSERT INTO et SELECT.

    Le problème est que je ne sais pas comment arrive les données dans la table après un COPY. Chaque colonne du fichier CSV dans une colonne de la table ? tout dans la première colonne ?
    Et sous PhpPgAdmin, ca me met que "temporaire" ne contient aucun enregistrement, donc pas moyen de visualiser, ni d'avancer dans mon projet.

    J'espere que j'ai été assez claire dans mes explications
    Merci pour votre temps,

    Yoite

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Points : 2 890
    Points
    2 890
    Par défaut
    Le problème est que je ne sais pas comment arrive les données dans la table après un COPY. Chaque colonne du fichier CSV dans une colonne de la table ? tout dans la première colonne ?
    En principe chaque colonne du CSV va dans une colonne de la table, sauf s'il y a erreur sur le caractère séparateur.

    Et sous PhpPgAdmin, ca me met que "temporaire" ne contient aucun enregistrement, donc pas moyen de visualiser, ni d'avancer dans mon projet.
    Il doit y avoir une erreur de manip quelque part. Comment est créée cette table "temporaire"?

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2009
    Messages : 25
    Points : 13
    Points
    13
    Par défaut
    Bonjour,

    Merci pour la réponse du COPY, c'est donc ce que j'esperait, je vais voir ca des demain.

    Après pour la création de la table, je fais ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    CREATE TABLE temporaire (Empire, Kingdom, Subkingdom, Infrakingdom, Phylum, Classe, Subclass, Ordre, Family);
    Voila

    Yoite

    EDIT 26 Aout 8h37 : La table temporaire a été créé avec l'utilisateur postgres, la base avec un autre utilisateur.Est-ce que cela peut avoir une incidence ?

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Points : 2 890
    Points
    2 890
    Par défaut
    Le SQL que tu indiques pour CREATE TABLE ne peut pas être bon car il n'y a pas de type aux colonnes. Enfin l'idée était surtout de voir s'il y avait des options spéciales du genre TEMPORARY qui pourraient expliquer que la table se voit dans une session et pas dans une autre. Apparemment ce n'est pas le cas.

    La table temporaire a été créé avec l'utilisateur postgres, la base avec un autre utilisateur.Est-ce que cela peut avoir une incidence ?
    Oui, il est possible que l'utilisateur qui fait le SELECT n'ait pas les droits pour lire la table. Mais dans ce cas il doit y avoir un message d'erreur spécifique au lieu de simplement la table qui apparaisse vide.
    Le plus simple est de faire recréer la table par cet utilisateur, postgres devrait avoir le droit d'écrire dedans de toute façon en tant que super utilisateur.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2009
    Messages : 25
    Points : 13
    Points
    13
    Par défaut
    Ok merci pour ces reponses !
    (Pour le Create Table VARCHAR(80) a été assigner a toutes les colonnes, je ne l'avait juste pas preciser pour pas que sa prenne trop trop de place )

    J'ai donc tout remodifier comme tu m'a dit, et ca marche ,je vois bien les enregistrements, chaque colonne du CSV va bien dans une colonne de la table !

    Cependant je bloque maintenant sur un nouveau probleme.
    Ce n'est pas moi qui est fait la structure de la base et donc je ne sais pas pourquoi il a fait telle ou telle chose (en tout cas pas precisement) et le probleme est que lorsque je fais des INSERT INTO avec le SELECT, ca me dit que dupliqué la clé romperait la contrainte unique donc je ne peux pas le faire.

    Y a t-il un moyen pour contourner temporairement cette contrainte ? car les INSERT INTO ne me serve que lorsque je met a jour la base et la table temporaire est supprimé après la maj.

    Je ne sais pas du coup si le contrainte ne sert que pour eviter d'avoir deux fois le meme mot dans la base (car un module de recherche est accessible depuis le site et fouille dans la base) ou si il y a une autre raison :/ Du coup difficille a dire si on l'a supprime ou pas :/

    Ou alors y a t-il un moyen rapide, de la supprimer temporairement ?

    Merci

  6. #6
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Points : 2 890
    Points
    2 890
    Par défaut
    Y a t-il un moyen pour contourner temporairement cette contrainte ? car les INSERT INTO ne me serve que lorsque je met a jour la base et la table temporaire est supprimé après la maj.
    La contrainte d'unicité porte sur la table destination, le fait que la table source soit temporaire n'entre pas en ligne de compte.
    La question est comment se fait-il que tu veuilles créer des doublons dans une colonne de la table destination qui justement n'accepte pas de doublon?
    Sinon il n'est pas possible de supprimer la contrainte temporairement. Si elle était supprimée, que l'insertion avait lieu, et qu'ensuite il fallait recréer la contrainte, alors cette création échouerait à cause des doublons.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2009
    Messages : 25
    Points : 13
    Points
    13
    Par défaut
    Ah ok ok, donc de ce point de vue la je voit peut etre mieux la chose.

    En fait, ce que je veux ce n'est pas faire des doublons, c'est ecraser l'ancien pour mettre le nouveau.

    Faut t-il que je fasse un DELETE FROM ma_table puis INSERT INTO ? ou y a t-il une option dans la requete INSERT INTO pour dire d'ecraser ?
    Si jamais je suis en train d'y regarder, donc c'est possible que j'ai la reponse d'ici peu.

    Mais si t'a une ptite astuce je suis tout ouïe aussi

    Merci bien !

  8. #8
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Points : 2 890
    Points
    2 890
    Par défaut
    En fait, ce que je veux ce n'est pas faire des doublons, c'est ecraser l'ancien pour mettre le nouveau.
    Dans ce cas DELETE suivi d'INSERT, c'est probablement le plus simple.

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2009
    Messages : 25
    Points : 13
    Points
    13
    Par défaut
    Ok merci bien je test ca je te tient au courant

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2009
    Messages : 25
    Points : 13
    Points
    13
    Par défaut
    Bonjour, voila, j'ai reussi a regler pas mal de petites choses et je sais desormais ou est ce que ca coince !

    Le fichier que je dois integrer regorge de doublons (plus de 300 lignes pour 50 mots unique environ et cela de meme pour ces 70 colonne :/).
    Donc dificile et très long d'y faire manuellement et pas vraiment efficace dans mon cas, car le fichier est mis a jour assez souvent.(ajout/modification).

    Je fais actuellement des recherches pour savoir si il y a des outils qui permettent, à la facon d'une macro, de ressortir les mêmes colonnes avec juste les données uniques.

    Est-ce que quelqu'un connaitrait ce genre d'outils ?

    Merci

  11. #11
    Membre éclairé Avatar de Arkhena
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 552
    Points : 769
    Points
    769
    Par défaut
    Bonjour,

    Vous pouvez très bien développer une macro Excel qui fera ce travail...

    Mais pourquoi ne pas mettre une clef primaire sur la table d'insertion qui du coup refusera les doublons ?

    Cordialement,

    Arkhena

  12. #12
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 040
    Points : 23 795
    Points
    23 795
    Par défaut
    Bonjour,

    Pourquoi ne pas intégrer la totalité du fichier dans une table temporaire via un COPY, et insérer les valeurs uniques (via un INSERT... SELECT DISTINCT...) dans la table cible ?

    Pas besoin de faire de macros...

    ced

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2009
    Messages : 25
    Points : 13
    Points
    13
    Par défaut
    SELECT DISTINCT est la commande qu'il me fallait, ca marche nickel !!

    Je ne l'a connaissais pas et ne l'avais pas trouvé dans mes recherches :/ Ou alors j'ai du passer a coté, surement ><

    En tout cas pour l'integration du fichier ca y est ca marche enfin !

    Pour un recapitulatif si des personnes se trouveraient dans la meme situation que moi :

    Creer une table temporaire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    CREATE TABLE temporaire (colonne1 VARCHAR(80), colonne2 VARACHAR(80), etc..);
    Puis, inserer le fichier dans cette table (chaque colonne du fichier ira dans une colone de la table de facon organiser : 1ere colonne dans la première, 2eme dans la deuxieme etc..)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    COPY temporaire FROM 'my_file.csv' WITH CSV;
    Puis inserer les données avec INSERT, et pour eviter d'avoir des doublons avec SELECT DISTINCT :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    INSERT INTO ma_table (ma_colonne)
    SELECT DISTINCT ma_colonne_2 FROM temporaire;
    Et voila, si lors de l'insertion votre n'etais pas vide et que vous voulez ecraser les anciennes données par les nouvelles, faites, avant l'insertion :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    DELETE FROM ma_table;
    Merci à tous !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 02/10/2010, 10h00
  2. insertion dans table avec plusieurs clés étrangères
    Par philippe281281 dans le forum Administration
    Réponses: 2
    Dernier message: 14/06/2006, 19h35
  3. Réponses: 4
    Dernier message: 29/04/2006, 00h21
  4. Pb d'écriture intempestive dans table avec SQL insert into
    Par pete_shifter dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 10/11/2005, 12h51
  5. Insertion enregistrement dans table
    Par naidinp dans le forum ASP
    Réponses: 13
    Dernier message: 11/09/2003, 10h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo