Я не был уверен, что изменить список ENUM () невозможно, поэтому я сделал тест. В MySQL v5.1.58 я создал тестовую таблицу InnoDB, которая содержит одно поле с именем «bool» типа ENUM («да», «нет»).
Тогда я казнил ...
ALTER TABLE `test`
CHANGE `bool` `bool` ENUM( 'yes', 'no', 'maybe' )
CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL
... и это сработало.
Я сделал что-то не так? Это зависит от двигателя дб? Почему все говорят, что изменение списка ENUM () невозможно? например. здесь http://komlenic.com/244/8-reasons-why-mysqls-enum-data-type-is-evil/
Ответы:
Пока таблица пуста, проблем нет. Пока новые значения для ENUM добавляются и не переименовываются в заполненной таблице, опять же нет проблем.
ENUM, который вы переопределили в своем вопросе, на самом деле сохранил исходные внутренние значения для yes и no, как это было в прошлой тестовой таблице.
Следующее относится к заполненным таблицам:
Что насчет этого?
Теперь у вас есть проблема. Для значений ENUM в полностью заполненной таблице их внутренние значения будут инвертированы, так что теперь да - нет, а нет - да.
Что насчет этого?
Большая проблема. В заполненной таблице да, может быть, сейчас. Новые строки, добавленные с помощью yes, отсоединяются от предыдущих строк yes, поскольку теперь они означают «возможно».
РЕЗЮМЕ
В MyISAM есть очень рискованные методы приманки и переключения, которые делают это очень быстро . Я настоятельно рекомендую не делать этого в InnoDB из-за его взаимодействия идентификатора табличного пространства с ibdata1.
источник
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.
и карта значения / индекса концептуализируется. Таким образом, в таблице будет значение ENUM, связанное с внутренним индексным номером. Изменение порядка строк приведет к изменению индексации метаданных. Это не сулит ничего хорошего для заполненной таблицы при переопределении ENUM.