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 :

Modification valeur enum & perte de données


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert Avatar de riete
    Homme Profil pro
    DevWeb - Oléiculteur
    Inscrit en
    Avril 2006
    Messages
    1 193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : DevWeb - Oléiculteur
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 193
    Par défaut Modification valeur enum & perte de données
    La question est pratiquement contenue dans le titre:

    J'ai une table qui contient un champ enum('Pomme','Poire','Orange','Banane').
    Une certain nombre d'enregistrements ont la valeur 'Poire'.

    A la demande des utilisateurs, je remplace 'Poire' par 'Prune' avec un Alter. Tous semble bien ce passer et je crois avoir remplacé à la volée toutes les valeur 'poire' par 'prune'. Que néni, toutes les valeurs poires ont disparue, mais ne sont pas remplacées par 'Prune' !!!

    Une explication serait bienvenue.

    Merci
    ---------------------
    MySQL 5.0.15

  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
    Quelle requête a commis cette hécatombe ?
    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 Expert Avatar de riete
    Homme Profil pro
    DevWeb - Oléiculteur
    Inscrit en
    Avril 2006
    Messages
    1 193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : DevWeb - Oléiculteur
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 193
    Par défaut
    Celle-ci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ALTER TABLE `ma_table` CHANGE `Type_Fruit` `Type_Fruit` ENUM( 'Pomme', 'Prune', 'Orange', 'Banane', 'Cerise' ) NULL DEFAULT NULL
    Alors qu'avant les valeur de Type_Fruit étaient ENUM( 'Pomme', 'Poire', 'Orange', 'Banane', 'Cerise' )

    J'ai du récupérer avec une moulinette toutes infos depuis une sauvegarde

    Si tu as une idée de la cause, je suis preneur car je n'aimerai pas que cela se reproduise. J'ai réussit à refaire la même manip, le résultat est le même. Donc, il ne s'agit pas d'un aléa passagé d'une grêve ou d'un volonté délibérée et temporaire du serveur de m'emmer...

  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
    En lisant ton problème cet après-midi, je me suis demandé ce qu'il se passait :
    - si on essaie d'entrer une valeur ne figurant pas dans l'énumération
    - si on change l'énumération et qu'il y a déjà des valeurs

    Tu es dans le second cas et tu as la réponse !

    MySQL nous dit :
    Si vous insérez une valeur illégale dans une énumération ENUM (c'est à dire, une chaîne qui n'est pas dans la liste de valeurs autorisées), la chaîne vide est insérée pour représenter une erreur. Cette chaîne peut être distinguée d'une chaîne vide 'normale' par le fait que cette chaîne à la valeur numérique 0.
    En changeant l'énumération, toutes les valeurs existantes ne satisfaisant pas la contrainte d'énumération ont été mises à blanc !

    Moralité : Eviter d'utiliser le type ENUM pour des choses qui peuvent changer, comme c'est le cas pour tes fruits.
    ENUM irait bien pour une colonne 'sexe' par exemple : ENUM('male', 'femelle', 'inconnu').
    Pour le reste, il est généralement préférable de faire une table externe et de mettre une clé étrangère. L'avantage est que si tu décides de remplacer le type 'poire' par 'prune', tu ne le changes que dans la table de référence et la clé étrangère reste identique. Si tu veux ajouter le type 'prune' et décider que toutes les lignes qui étaient de type 'poire' deviennent des 'prune' tu changes la clé étrangère.
    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 Expert Avatar de riete
    Homme Profil pro
    DevWeb - Oléiculteur
    Inscrit en
    Avril 2006
    Messages
    1 193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : DevWeb - Oléiculteur
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 193
    Par défaut
    Merci pour ta réflexion à ce sujet.
    Je comprends bien ce qu'il s'est passé maintenant.

    Mais je ferais 2 remarques bien distinctes:

    1/ pour ce qui est d'utiliser des tables externes avec des clef etrangères, j'en fais déjà usage bien entendu . Mais dans le cas de cette base qui comme tu l'aura compris (ou pas d'ailleurs) n'a rien à voir avec les fruits et légumes. Une des tables qui est utiliser est un descriptif techniques d'un matériel complexes de pièces détachées. Si je devais utiliser des tables externes à chaque fois que j'ai des choix multiples pour des valeur de champ, j'aurais pratiquement autant de tables que de champ.
    Exemple: table1 champ type_moteur : valeurs "Dupond, Schneider, Beringer". En général ces valeurs sont fixes.

    J'ai fait le choix arbitraire de créer des tables à partir du moment ou il y a plus de 20 choix possibles.

    2/ En relisant le manuel MySQL, je me suis laissé abusé par le fait que les valeurs sont stockées sous formes numériques dans la base, alors que les valeurs elles même ne le sont que dans la description de la table.
    Je me suis dit, si je change une des valeurs, elles changeront toutes. GRAVE erreur !!
    Ce type de changement ne m'avait jamais été demandé, à l'avenir, voici la solution que je propose:

    - créer la nouvelle entrée dans l'ENUM concerné
    - Faire une requête pour déterminer tous les enregistrements concernée
    - les mettres à jour avec la nouvelle valeur
    - Supprimer l'ancienne.

    J'espère que nous nous sommes compris.

    A+

    Riete

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

Discussions similaires

  1. Perte des données Cartes IGN après modification du contrat
    Par lbreton dans le forum IGN API Géoportail
    Réponses: 10
    Dernier message: 22/12/2014, 16h10
  2. Réponses: 2
    Dernier message: 02/10/2009, 16h54
  3. [XL-2003] Modification valeurs base de données via userform
    Par Kimaos dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 23/05/2009, 05h29
  4. Réponses: 6
    Dernier message: 24/10/2008, 23h16
  5. Réponses: 1
    Dernier message: 18/12/2006, 11h57

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