Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Requêtes
Requêtes Forum d'entraide sur les requêtes MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 04/01/2012, 00h26   #1
Membre à l'essai
 
Inscription : mars 2008
Messages : 140
Détails du profil
Informations forums :
Inscription : mars 2008
Messages : 140
Points : 22
Points : 22
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 :
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 :
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
yamatoshi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2012, 09h27   #2
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
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 : 11 029
Points : 18 331
Points : 18 331
Envoyer un message via MSN à CinePhil
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 de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« 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 Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2012, 10h27   #3
Membre à l'essai
 
Inscription : mars 2008
Messages : 140
Détails du profil
Informations forums :
Inscription : mars 2008
Messages : 140
Points : 22
Points : 22
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
yamatoshi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2012, 12h17   #4
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
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 : 11 029
Points : 18 331
Points : 18 331
Envoyer un message via MSN à CinePhil
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 de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« 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 Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2012, 13h42   #5
Membre à l'essai
 
Inscription : mars 2008
Messages : 140
Détails du profil
Informations forums :
Inscription : mars 2008
Messages : 140
Points : 22
Points : 22
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 ?
yamatoshi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2012, 13h59   #6
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
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 : 11 029
Points : 18 331
Points : 18 331
Envoyer un message via MSN à CinePhil
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 !
Citation:
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".

Citation:
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 de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« 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 Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2012, 16h15   #7
Membre à l'essai
 
Inscription : mars 2008
Messages : 140
Détails du profil
Informations forums :
Inscription : mars 2008
Messages : 140
Points : 22
Points : 22
=> Aucune colonne ne s'appelle donc "nom".

Oui aucune colonne du fichier d'origine ne s'appelle nom.

Si ton patron renomme par exemple la colonne "Champ1" en "Nom" il ne peut pas y avoir d'erreur !

Oui sauf que comme l'identification des colonnes se fait par une liste déroulante qui se trouve sur chaque colonne. Si je sélectionne pour la première colonne le champ nom... et que par erreur je sélectionne nom pour le 4e. Ben j'ai le Fatal Error car lorsque la 4e colonne voudra prendre "nom" ben il me dira que ce champ existe déjà ! D'où ma question...

Que fais-tu de ces données ensuite ?
L'objectif est de constituer des tables mysql avec les fichiers csv qui contienne des données clients. Qu'on peut visualiser depuis des requêtes et ou ré exporté avec des filtres. Par exemple export csv de la table_user1 avec juste le nom et prénom et téléphone du client...etc

Citation:
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.
Le problème est le même car si j'importe les données csv dans une table temporaire vu que je sais pas déterminer quelle colonne de données de la table temporaire dois je aller répliquer dans le champ nom de ma table finale par exemple... Je me suis dit, que le mieux serait de peut être transformer directement la table temporaire juste en renommant les champs correctement comme ça les requêtes fonctionneront je n'aurais qu'à mettre le nom de la table en paramètre dans ma fonction qui explore les données....

Je ne sais pas si j'ai été claire ??? Mais je te remercie de te prendre du temps et de te soucier de mon problème.
yamatoshi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2012, 19h06   #8
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
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 : 11 029
Points : 18 331
Points : 18 331
Envoyer un message via MSN à CinePhil
Ça ne ressemble pas à une base de données structurée ton truc !
J'ai l'impression que ton patron ferait aussi bien d'utiliser un tableur !

Citation:
Si je sélectionne pour la première colonne le champ nom... et que par erreur je sélectionne nom pour le 4e.
Avec un peu d'Ajax, tu peux faire des listes qui supprimeront la colonne "nom" des autres listes déroulantes une fois que ce nom aura été choisi.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« 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 Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2012, 19h35   #9
Membre Expert
 
Homme Eric Dureuil
Développeur informatique
Inscription : avril 2011
Messages : 874
Détails du profil
Informations personnelles :
Nom : Homme Eric Dureuil
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : avril 2011
Messages : 874
Points : 1 361
Points : 1 361
salut,

la solution de la table d'import intermédiaire peut être un bon plan en effet...

ne serait-ce que pour la visualisation de ce qu'il y a dedans et une fois sur le serveur mysql ça fait moins de brassage php-mysql

à partir de cette table, dont il est facile de recueillir la structure avec php, tu peux constituer ta requête de remplissage dynamiquement coté php en fonction des choix de ton patron sur les colonnes à garder et leur ordre...

en résumé:
  • tu importes ton csv dans une table dont le nom est fixé pour ça...
  • tu affiches les n premières lignes et pour chaque colonne une liste de choix:
    • ne pas impoter (par défaut)
    • nom de colonne destination 1
    • nom de colonne destination 2
    • ...
  • un bouton importer qui fait les actions suivantes:
    • crée la requête d'import dynamiquement à partir des choix
    • fait l'import et remplace l'affichage par le résultat et des boutons "recommencer" (si nécessaire) et finir (qui supprime alors la table intermediaire)

comme ça aucune modification de structure à faire, tu vois...
c'est ta requête d'import entre tes 2 tables qui fait ensuite le boulot d'adaptation du nombre de colonne et le nom de la destination, l'ordre importe peu par contre...
__________________
Eric Dureuil, développeur web, c/c++, java indépendant
soyons
pensez à mettre et
ericd69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 06h24.


 
 
 
 
Partenaires

Hébergement Web