Ich war mir nicht sicher, ob das Ändern der ENUM () -Liste nicht möglich ist, also habe ich einen Test durchgeführt. In MySQL v5.1.58 habe ich eine InnoDB-Testtabelle erstellt, die ein Feld namens 'bool' vom Typ ENUM enthält ('yes', 'no').
Dann habe ich ausgeführt ...
ALTER TABLE `test`
CHANGE `bool` `bool` ENUM( 'yes', 'no', 'maybe' )
CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL
...und es hat funktioniert.
Habe ich etwas falsch gemacht? Ist es abhängig von DB Engine? Warum sagen alle, dass das Ändern einer ENUM () -Liste nicht möglich ist? z.B. hier http://komlenic.com/244/8-reasons-why-mysqls-enum-data-type-is-evil/
Antworten:
Solange die Tabelle leer ist, gibt es kein Problem. Solange neue Werte für ENUM angehängt und bei einer aufgefüllten Tabelle nicht umbenannt werden, ist dies wiederum kein Problem.
Die ENUM, die Sie in Ihrer Frage neu definiert haben, hat tatsächlich die ursprünglichen internen Werte für yes und no beibehalten, da die Testtabelle diese zuletzt gespeichert hat.
Für ausgefüllte Tabellen gilt Folgendes:
Was ist damit?
Jetzt hast du ein Problem. Bei den ENUM-Werten in einer vollständig ausgefüllten Tabelle würden die internen Werte umgekehrt, sodass yes jetzt no und no jetzt yes ist.
Was ist damit?
Großes Problem. In einer bevölkerten Tabelle steht ja jetzt vielleicht. Neue mit yes eingefügte Zeilen werden von den vorherigen yes-Zeilen getrennt, da sie jetzt möglicherweise bedeuten.
ZUSAMMENFASSUNG
In MyISAM gibt es sehr risikoreiche Köder-und-Wechsel-Techniken, um dies sehr schnell zu tun . Ich würde dringend davon abraten, dies in InnoDB zu tun, da die Tablespace-ID mit ibdata1 interagiert.
quelle
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.
und die Wert- / Indexzuordnung ist konzeptualisiert. Es würde also einen ENUM-Wert in einer Tabelle geben, die der internen Indexnummer zugeordnet ist. Durch Neuanordnen der Zeichenfolgen wird die Metadatenindizierung neu angeordnet. Dies ist kein gutes Zeichen für eine aufgefüllte Tabelle, wenn eine ENUM neu definiert wird.