2012-09-26 12 views
7

Ho una tabella con una colonna enum denominata action. I valori consentiti al momento sono: act1,act2,act3,act4. Voglioe act4 da rimuovere e lo stato attuale della mia tabella non contiene alcuna riga con act3 o act4.Rimozione valori enum dalla colonna mysql

Quando sto cercando di modificare la colonna con il nuovo set di valori, viene generato un errore Data Truncated for column action.

Si prega di suggerire come rimuovere i valori richiesti.

+0

Forse non usare l'enum? http://komlenic.com/244/8-reasons-why-mysqls-enum-data-type-is-evil/ – fancyPants

+0

Mostra le istruzioni CREATE TABLE e ALTER TABLE. –

risposta

9

L'utilizzo di ALTER TABLE per l'aggiunta di valori enum è corretto e descritto in MySQL documentation.

Tuttavia, per rimuovere i valori enum l'opzione migliore è creare una nuova colonna per eseguire la modifica.

ALTER TABLE your_table ADD new_action_column ENUM('act1', 'act2') ... ; 
UPDATE your_table SET new_action_column = action; 
ALTER TABLE your_table DROP action; 
ALTER TABLE your_table CHANGE new_action_column action ENUM('act1', 'act2') ... ; 

Modifica

proposito. Utilizzare ENUM non è la migliore idea, dovresti usare invece INT.

8 Reasons Why MySQL's ENUM Data Type Is Evil

suggerisco di utilizzare un mapping come

+------+-----+ 
| ENUM | INT | 
+======+=====+ 
| act1 | 0 | 
+------+-----+ 
| act2 | 1 | 
+------+-----+ 
+0

"dovresti usare INT invece." - Perché? – Barmar

+0

@Barmar [8 motivi per cui il tipo di dati ENUM di MySQL è malvagio] (http://komlenic.com/244/8-reasons-why-mysqls-enum-data-type-is-evil/) Tombom lo ha già menzionato. Suggerisco di usare una mappatura tra i valori di enum 'act1' e 'act2' e int valori 0, 1. –

+0

@FlorianParain Mi chiedo perché ci dovrebbe essere qualche vantaggio non modificare la colonna esistente, ma piuttosto aggiungerne una temporanea. Riesci a ragionare sulla tua affermazione? Grazie! –

2

Prima eseguire una query.

UPDATE table_name SET action = '' WHERE action IN ('act3', 'act4'); 

dopo aver eseguito questa query.

ALTER TABLE table_name CHANGE action action ENUM('act1', 'act2'); 

non è necessario lasciare il tavolo o lasciare il campo. ma è necessario eliminare o aggiornare tutti i dati con i valori che si desidera rimuovere.

+0

Ha detto che non ci sono righe con i valori che sta per rimuovere. – Barmar

+0

Non sono obbligato a eseguire i passaggi precedenti poiché la mia tabella non contiene righe con "act3" e "act4". L'errore è ancora lì. – mickeymoon

0

Le altre due risposte già coperti la questione in dettaglio più grande, ma qui è una questione semplice perché si potrebbero non essere in grado di fare semplicemente ALTER TABLE. Se disponi di un ENUM ("BAR", "FOO", "REMOVEME") e restituisce un errore che dice qualcosa sulla falsariga di Data qualcosa di troncato, potresti già avere una voce impostata sul membro di Enum che desideri rimuovere. Quindi prima dovresti fare qualcosa come

UPDATE yourtable SET enumrow = 'FOO' WHERE yourenumrow = 'REMOVEME';

In questo modo, tutte le voci che avevano removeMe sarà ora FOO e la tabella può essere modificato utilizzando

ALTER TABLE CHANGE YourTable yourenumrow yourenumrow ENUM ('FOO', 'BAR') PREDEFINITO NULL;