Eu não tinha certeza se a alteração da lista ENUM () não é possível, então fiz um teste. No MySQL v5.1.58, fiz uma tabela de teste do InnoDB que contém um campo chamado 'bool' do tipo ENUM ('yes', 'no').
Então eu executei ...
ALTER TABLE `test`
CHANGE `bool` `bool` ENUM( 'yes', 'no', 'maybe' )
CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL
... e funcionou.
Eu fiz alguma coisa errada? É dependente do mecanismo db? Por que todo mundo diz que alterar uma lista ENUM () não é possível? por exemplo. aqui http://komlenic.com/244/8-reasons-why-mysqls-enum-data-type-is-evil/
Respostas:
Contanto que a tabela esteja vazia, não há problema. Desde que novos valores para ENUM sejam anexados e não renomeados, dada uma tabela preenchida, novamente não há problema.
O ENUM que você redefiniu na sua pergunta realmente manteve os valores internos originais de yes e no como a tabela de teste se lembrou pela última vez.
O seguinte se aplica às tabelas preenchidas:
E isso?
Agora você tem um problema. Os valores ENUM em uma tabela totalmente preenchida teriam seus valores internos revertidos para que sim agora não e agora não seja sim.
E isso?
Grande problema. Em uma tabela preenchida, sim é agora talvez. Novas linhas inseridas com yes são desconectadas das linhas yes anteriores porque agora significam talvez.
RESUMO
Existem técnicas de isca e troca de alto risco para fazer isso muito rapidamente no MyISAM . Eu não recomendaria isso no InnoDB por causa de sua interação de identificação do espaço de tabela com o ibdata1.
fonte
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.
e o mapa de valor / índice é conceitualizado. Portanto, haveria um valor ENUM em uma tabela associada ao número do índice interno. Reorganizar as strings reorganizará a indexação de metadados. Isso não é um bom presságio para uma tabela preenchida ao redefinir um ENUM.