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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2009
    Messages : 25
    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 Expert
    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
    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 averti
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2009
    Messages : 25
    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 Expert
    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
    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 averti
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2009
    Messages : 25
    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 Expert
    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
    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.

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 02/10/2010, 09h00
  2. insertion dans table avec plusieurs clés étrangères
    Par philippe281281 dans le forum Administration
    Réponses: 2
    Dernier message: 14/06/2006, 18h35
  3. Réponses: 4
    Dernier message: 28/04/2006, 23h21
  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, 11h51
  5. Insertion enregistrement dans table
    Par naidinp dans le forum ASP
    Réponses: 13
    Dernier message: 11/09/2003, 09h56

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