it-swarm.it

È possibile modificare gli elenchi ENUM ()?

Non ero sicuro che cambiare l'elenco ENUM () non fosse possibile, quindi ho fatto un test. In MySQL v5.1.58 ho realizzato una tabella di test InnoDB che contiene un campo chiamato 'bool' di tipo ENUM ('yes', 'no').

Poi ho eseguito ...

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

... e ha funzionato.

Ho fatto qualcosa di sbagliato? Dipende dal motore db?
Perché tutti dicono che non è possibile modificare un elenco ENUM ()? per esempio. qui http://komlenic.com/244/8-reasons-why-mysqls-enum-data-type-is-evil/

19
Aalex Gabi

Finché la tabella è vuota, non ci sono problemi. Finché vengono aggiunti nuovi valori per ENUM e non rinominati in base a una tabella popolata, di nuovo nessun problema.

L'ENUM che hai ridefinito nella tua domanda in realtà ha mantenuto i valori interni originali per yes e no come la tabella di test ha ricordato l'ultima volta.

Quanto segue si applica alle tabelle popolate:

Che dire di questo?

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

Ora hai un problema. I valori ENUM in una tabella completamente popolata avrebbero i loro valori interni invertiti in modo che sì sia ora no e no ora sia sì.

Che dire di questo?

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

Grande problema. In una tabella popolata, sì ora è forse. Le nuove righe inserite con yes vengono disconnesse dalle precedenti righe yes perché ora significano forse.

SOMMARIO

Esistono tecniche ad alto rischio, esca e scambia per farlo molto rapidamente in MyISAM . Consiglio vivamente di non farlo in InnoDB a causa della sua interazione con id del tablespace con ibdata1.

14
RolandoMySQLDBA