Nie byłem pewien, czy zmiana listy ENUM () nie jest możliwa, więc zrobiłem test. W MySQL 5.1.58 stworzyłem testową tabelę InnoDB, która zawiera jedno pole o nazwie „bool” typu ENUM („tak”, „nie”).
Potem wykonałem ...
ALTER TABLE `test`
CHANGE `bool` `bool` ENUM( 'yes', 'no', 'maybe' )
CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL
... i zadziałało.
Czy zrobiłem coś złego? Czy to zależy od silnika db? Dlaczego wszyscy mówią, że zmiana listy ENUM () nie jest możliwa? na przykład. tutaj http://komlenic.com/244/8-reasons-why-mysqls-enum-data-type-is-evil/
Odpowiedzi:
Dopóki stół jest pusty, nie ma problemu. Tak długo, jak dodawane są nowe wartości ENUM i nie zmienia się ich nazwy w zapełnionej tabeli, znowu nie ma problemu.
ENUM, który przedefiniowałeś w swoim pytaniu, zachował oryginalne wartości wewnętrzne dla tak i nie, gdy tabela testowa go zapamiętała.
Poniższe zasady dotyczą zapełnianych tabel:
A co z tym?
Teraz masz problem. Wartości ENUM we w pełni wypełnionej tabeli zostałyby odwrócone, dlatego tak jest teraz nie, a nie jest teraz tak.
A co z tym?
Wielki problem. W zapełnionej tabeli może tak jest teraz. Nowe wiersze wstawione z tak są odłączone od poprzednich wierszy tak, ponieważ teraz oznaczają być może.
STRESZCZENIE
Istnieją bardzo ryzykowne techniki przynęty i zamiany, aby zrobić to bardzo szybko w MyISAM . Zdecydowanie odradzam to robić w InnoDB ze względu na interakcję identyfikatora obszaru tabel z ibdata1.
źródło
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.
a mapa wartości / indeksu jest konceptualizowana. Zatem w tabeli znajdowałaby się wartość ENUM związana z wewnętrznym numerem indeksu. Zmiana kolejności ciągów spowoduje zmianę kolejności indeksowania metadanych. Nie wróży to dobrze zapełnionej tabeli podczas redefiniowania ENUM.