9
votes

Suppression des valeurs ENUM de la colonne MySQL

J'ai une table avec une colonne ENUM appelée action . Les valeurs autorisées sont actuellement: ACT1, ACT2, ACT3, ACT4 . Je veux act3 et act4 à supprimer et que l'état actuel de mon tableau ne contient aucune ligne avec act3 ou act4 .

Lorsque j'essaie de modifier la colonne avec le nouvel ensemble de valeurs, il s'agit d'une erreur Data tronquées pour l'action de colonne .

S'il vous plaît suggérer comment puis-je supprimer les valeurs requises.


2 commentaires

Peut-être n'utilisez pas d'énum? Komlenic.com/244/8-Reasons -Pourquoi MYSQLS-ENUM-DATA-TYPE-TYPE-IST-EVALIER


Montrez votre table Créer et modifier des déclarations de table.


3 Réponses :


11
votes

Utilisation de alter Table code> pour l'ajout de valeurs ENUM est OK et décrit dans le MySQL Documentation .

Toutefois, pour supprimer les valeurs d'énum, ​​la meilleure option est de créer une nouvelle colonne pour effectuer le changement. P>

+------+-----+
| ENUM | INT |
+======+=====+
| act1 |  0  |
+------+-----+
| act2 |  1  |
+------+-----+


3 commentaires

"Vous devriez utiliser int plutôt." - Pourquoi?


@Barmar 8 raisons pour lesquelles le type de données de MySQL enum Est le mal Tombom l'a déjà mentionné. Je suggère d'utiliser un mappage entre vos valeurs d'énorme "ACT1" et "ACT2" et INT Valeurs 0, 1.


@Florianparain Je me demande pourquoi il devrait y avoir des avantageux de ne pas modifier la colonne existante, mais plutôt d'ajouter une temporaire. Pouvez-vous raisonner votre déclaration? Merci!



3
votes

exécuter d'abord une requête.

ALTER TABLE table_name CHANGE action action ENUM( 'act1', 'act2' );


2 commentaires

Il a dit qu'il n'y a pas de rangs avec les valeurs qu'il va supprimer.


Je ne suis pas obligé de faire les étapes ci-dessus car ma table ne contient pas de lignes avec "ACT3" et "ACT4". L'erreur est toujours là.



1
votes

Les deux autres réponses ont déjà couvert la question de plus en détail, mais voici un problème simple pourquoi vous peut ne pas être en mesure de simplement faire la table. Si vous avez une énumération ('bar', 'foo', "removeme") et cela donne une erreur disant à dire quelque chose dans le sens des données tronquées quelque chose, vous pouvez déjà avoir une entrée définie sur le membre très ENum que vous souhaitez supprimer. Donc, vous avez d'abord besoin de faire quelque chose comme

Mettez à jour votre jeu de carte Enumrow = 'foo' où Y VendenumRow = 'Removeme';

De cette façon, toutes les entrées qui avaient Removeme seront désormais foo et la table peut être modifiée en utilisant

ALTER TABLE TABLE VÊMEDABLE CHANGEMENT VÊNUMROW YURENUMROW ENUM ('FOO', 'BAR') NULL par défaut;


0 commentaires