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

Requêtes MySQL Discussion :

Alter Table IF NOT EXISTS


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Mars 2008
    Messages
    178
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 178
    Par défaut Alter Table IF NOT EXISTS
    Bonjour

    J'ai un petit soucis. J'ai une requête mySql qui modifie le nom d'un champ.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ALTER TABLE $table CHANGE $ancienchamp $nouveauchamp VARCHAR( 255 )
    Ca marche très bien quand le nouveau nom choisi de mon champ est différent d'un des champs existant dans ma table. Mais si je choisi un nom de champ qui existe déjà dans ma table j'ai cette magnifique exception que je ne sais contourner

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42S21]: Column already exists: 1060 Duplicate column name
    Aussi je voulais savoir n'y a t-il pas une requête mySql qui puisse me permettre de changer le nom de mon champ tout en vérifiant au préalable le nouveau nom choisi n'existe pas déjà dans ma table ? Ou alors un moyen de gérer le message d'erreur plus proprement sans qu'il m'affiche le gros FATAL Error Orange de WAMP ?

    Merci

  2. #2
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    Pour quelle raison as-tu besoin de modifier, par un programme externe, le nom d'une colonne (et pas d'un champ, on n'est pas à la campagne !) ?

    En principe on modélise les données, on implémente le modèle de données et les programmes externes interroge la base de données sans en modifier la structure.
    Et quand on a besoin de modifier la structure d'une BDD, c'est lors de modifications importantes des besoins initiaux. On le fait alors directement dans la BDD, éventuellement avec un logiciel fait pour ça, genre phpMyAdmin ou MySQL Workbench, mais pas par un programme externe fait à la main, ou à la rigueur par un script SQL qu'on aura testé au préalable sur une environnement de test.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  3. #3
    Membre confirmé
    Inscrit en
    Mars 2008
    Messages
    178
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 178
    Par défaut
    Bonjour j'ai besoin de modifier les champs de ma table car c'est un besoin exprimé par mon patron sur un projet de script permettant de charger un CSV dans une base.

    Lorsqu'on charge un csv dans une base nous avons des utilisateurs qui viennent avec des fichiers différents. Le souhait de mon patron est que ces utilisateurs chargent dans la base le fichier tel quel. Et lui puisse avoir la main sans passer par phpMyadmin pour modifier les champs des colonnes avec les noms qu'ils souhaitent.

    Au chargement du csv d'orgine dans la base, les colonnes prennent par défaut les noms champ1 champ2 champ3...etc en fonction du nombre de colonne dans le fichier.

    L'objectif est maintenant de pouvoir changer champ1 en client par exemple. J'ai réussi à le faire sauf que comme j'indiquais dans mon premier post. Si on change le nom d'un champ par un nom déjà existant j'ai une exception ce qui est normal.

    Ce que je souhaiterais savoir, c'est de savoir s'il y a une requête qui teste si le champ existe ou nom avant de modifier le champ pour éviter d'avoir l'exception à l'écran ?

    Merci

  4. #4
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    Encore une fois, les champs sont à la campagne ou dans les formulaires, pas dans les tables SQL !

    Pour connaître les colonnes existantes dans une table, interroge la vue information_schema.COLUMNS.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  5. #5
    Membre confirmé
    Inscrit en
    Mars 2008
    Messages
    178
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 178
    Par défaut
    Les champs sont dans ma table Mysql ??? Ok je me suis peut être mal exprimé. Alors voici un peu de précision.

    J'ai un utilisateur qui charge 1 fichier csv avec 4 colonnes qui comportent chacune des données.

    j'ai un deuxième qui charge un fichier csv mais de 7 colonnes.

    Lorsqu'un utilisateur charge son fichier, par défaut les champs correspondant dans la base mysql sont nommés champ1, champ2...etc Donc dans phpMyadmin la structure de mes deux tables est la suivante :

    table_user1

    Champ1, champ2, champ3, champ4

    Table_user2
    Champ1,champ2,champ3,champ4,champ5,champ6,champ7

    Le souci est que parmis ces champs on ne sait lequel correspond au nom du client, prénom du client...etc

    J'ai donc fait un script qui m'affiche les 10 première ligne de chaque table. Ainsi mon patron peut à base d'un menu déroulant. Dire par exemple que le champ1 de tab_user1 contient les noms des clients, le champ 3 le prénom et le 4 l'adresse.

    Sauf que mon souci est que si je dis que le champ 1 c'est le nom par exemple. Si ma table_user1 a déjà ce champ, il me génère une exception ce qui est normal car on ne peut avoir deux champs dans une table qui porte le même nom.

    Je ne sais pas si c'est plus claire à présent ?

  6. #6
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    J'avais bien compris.
    Je t'aiguillais sur information.schema.COLUMN pour que tu testes l'existence du nom de la colonne.

    Ceci dit, faudrait savoir !
    Donc dans phpMyadmin la structure de mes deux tables est la suivante :

    table_user1
    Champ1, champ2, champ3, champ4

    Table_user2
    Champ1,champ2,champ3,champ4,champ5,champ6,champ7
    => Aucune colonne ne s'appelle donc "nom".

    J'ai donc fait un script qui m'affiche les 10 première ligne de chaque table. Ainsi mon patron peut à base d'un menu déroulant. Dire par exemple que le champ1 de tab_user1 contient les noms des clients, le champ 3 le prénom et le 4 l'adresse.

    Sauf que mon souci est que si je dis que le champ 1 c'est le nom par exemple. Si ma table_user1 a déjà ce champ, il me génère une exception ce qui est normal car on ne peut avoir deux champs dans une table qui porte le même nom.
    Si ton patron renomme par exemple la colonne "Champ1" en "Nom" il ne peut pas y avoir d'erreur !

    Les fichiers CSV d'import ne comprennent-il pas d'entêtes de colonnes ?

    Que fais-tu de ces données ensuite ?
    Je préconiserais de n'utiliser les tables d'importation que pour l'importation et de répartir les données de ces tables temporaires dans la vraie structure de la BDD.

    Dès lors, tu n'as plus besoin de renommer les colonnes de la table d'import mais seulement de savoir que dans la requête de répartition la colonne "nom" de la table "X" est alimentée par la colonne "champ1" de la table d'import.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

Discussions similaires

  1. create table if not exists
    Par olibara dans le forum MS SQL Server
    Réponses: 9
    Dernier message: 18/03/2010, 16h01
  2. AS400 Probleme de Create table if not exists
    Par mczikas dans le forum Développement de jobs
    Réponses: 0
    Dernier message: 24/02/2009, 17h04
  3. [XI R2] Table does not exist
    Par Julien59 dans le forum Designer
    Réponses: 1
    Dernier message: 25/09/2008, 16h27
  4. provider 0x80040E37 table does not exist
    Par steph04 dans le forum ASP
    Réponses: 8
    Dernier message: 29/04/2005, 10h56
  5. [DB2] create table... if not exists ?
    Par iubito dans le forum DB2
    Réponses: 6
    Dernier message: 23/03/2004, 18h26

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