it-swarm.com.de

Ist es möglich, ENUM () Listen zu ändern?

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 ('yes', 'no') enthält.

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 sagt jeder, 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/

19
Aalex Gabi

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 die ursprünglichen internen Werte für Ja und Nein beibehalten, da sich die Testtabelle zuletzt daran erinnert hat.

Für ausgefüllte Tabellen gilt Folgendes:

Was ist damit?

ALTER TABLE  `test`
CHANGE  `bool`  `bool` ENUM(  'no',  'yes',  'maybe' )
CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL

Jetzt hast du ein Problem. Bei den ENUM-Werten in einer vollständig ausgefüllten Tabelle werden die internen Werte umgekehrt, sodass Ja jetzt Nein und Nein jetzt Ja ist.

Was ist damit?

ALTER TABLE  `test`
CHANGE  `bool`  `bool` ENUM(  'maybe', 'no',  'yes' )
CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL

Großes Problem. In einer bevölkerten Tabelle ist ja jetzt vielleicht. Neue mit yes eingefügte Zeilen werden von den vorherigen yes-Zeilen getrennt, da sie jetzt möglicherweise bedeuten.

ZUSAMMENFASSUNG

Es gibt sehr risikoreiche Köder-und-Schalter-Techniken, um dies in MyISAM sehr schnell zu tun . Ich würde dringend davon abraten, dies in InnoDB zu tun, da die Tablespace-ID mit ibdata1 interagiert.

14
RolandoMySQLDBA