2012-09-26 13 views
7

Tengo una tabla con una columna enumerada llamada action. Los valores permitidos actualmente son: act1,act2,act3,act4. Quiero que se eliminen act3 y act4 y que el estado actual de mi tabla no contiene filas con act3 o act4.Eliminando los valores enum de la columna mysql

Cuando intento modificar la columna con el nuevo conjunto de valores, arroja un error Data Truncated for column action.

Indique cómo puedo eliminar los valores requeridos.

+0

¿Tal vez no use enum en absoluto? http://komlenic.com/244/8-reasons-why-mysqls-enum-data-type-is-evil/ – fancyPants

+0

Muestre sus instrucciones CREATE TABLE y ALTER TABLE. –

Respuesta

9

El uso de ALTER TABLE para agregar valores enum es correcto y se describe en el MySQL documentation.

Sin embargo, para eliminar los valores enum, la mejor opción es crear una nueva columna para realizar el cambio.

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') ... ; 

Editar

Por cierto. Usar ENUM no es la mejor idea, en su lugar debe usar INT.

8 Reasons Why MySQL's ENUM Data Type Is Evil

que sugieren su uso en el mapeo

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

"deberías usar INT en su lugar". - ¿Por qué? – Barmar

+0

@Barmar [8 razones por las cuales el tipo de datos ENUM de MySQL es malo] (http://komlenic.com/244/8-reasons-why-mysqls-enum-data-type-is-evil/) Tombom ya lo mencionó. Sugiero usar un mapeo entre los valores enum 'act1' y 'act2' y los valores int 0, 1. –

+0

@FlorianParain Me pregunto por qué debería haber alguna ventaja en no alterar la columna existente, sino en agregar una temporal. ¿Puedes razonar tu declaración? ¡Gracias! –

2

Primera ejecutar una consulta.

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

después de esta ejecución esta consulta.

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

no hay necesidad de soltar su mesa o soltar su campo. pero debe borrar o actualizar todos los datos que tienen los valores que desea eliminar.

+0

Dijo que no hay filas con los valores que va a eliminar. – Barmar

+0

No es necesario que realice los pasos anteriores ya que mi tabla no contiene filas con 'act3' y 'act4'. El error sigue ahí. – mickeymoon

0

Las otras dos respuestas ya cubrieron la pregunta con mayor detalle, pero aquí hay un problema simple por el cual usted no puede simplemente hacer ALTER TABLE. Si tiene un ENUM ('BAR', 'FOO', 'REMOVEME') y le da un error al decir algo en la línea de datos truncados algo, es posible que ya tenga una entrada establecida para el mismo miembro de Enum que desea eliminar. Por lo tanto, primero debe hacer algo como

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

De esta manera, todas las entradas que tenía REMOVEME será ahora FOO y la tabla puede ser alterado usando

ALTER tabla de cambio yourtable yourenumrow yourenumrow ENUM ('FOO', 'BAR') NULL DEFAULT;

Cuestiones relacionadas