Je ne savais pas si changer la liste ENUM () n'était pas possible, j'ai donc fait un test. Dans MySQL v5.1.58, j'ai fait une table de test InnoDB qui contient un champ appelé 'bool' de type ENUM ('oui', 'non').
Puis j'ai exécuté ...
ALTER TABLE `test`
CHANGE `bool` `bool` ENUM( 'yes', 'no', 'maybe' )
CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL
... et ça a marché.
Ai-je fait quelque chose de mal? Dépend-il du moteur db? Pourquoi tout le monde dit que changer une liste ENUM () n'est pas possible? par exemple. ici http://komlenic.com/244/8-reasons-why-mysqls-enum-data-type-is-evil/
Réponses:
Tant que la table est vide, il n'y a pas de problème. Tant que de nouvelles valeurs pour ENUM sont ajoutées et non renommées étant donné une table remplie, là encore aucun problème.
L'ENUM que vous avez redéfini dans votre question a en fait conservé les valeurs internes d'origine pour oui et non, comme le tableau de test s'en est souvenu en dernier.
Ce qui suit s'applique aux tables remplies:
Et ça?
Vous avez maintenant un problème. Les valeurs ENUM dans une table entièrement remplie auraient leurs valeurs internes inversées de sorte que oui est maintenant non et non est maintenant oui.
Et ça?
Gros problème. Dans une table peuplée, oui l'est peut-être maintenant. Les nouvelles lignes insérées avec oui sont déconnectées des lignes oui précédentes car elles signifient maintenant peut-être.
SOMMAIRE
Il existe des techniques d'appât et de changement à très haut risque pour le faire très rapidement dans MyISAM . Je déconseille fortement de faire cela dans InnoDB en raison de son interaction avec le tablespace id avec ibdata1.
la source
For example, a column specified as ENUM('one', 'two', 'three') can have any of the values shown here. The index of each value is also shown.
et la carte valeur / index est conceptualisée. Ainsi, il y aurait une valeur ENUM dans une table associée à un numéro d'index interne. Réorganiser les chaînes réorganisera l'indexation des métadonnées. Cela n'augure rien de bon pour une table remplie lors de la redéfinition d'un ENUM.