El manual de referencia de MySQL no proporciona un ejemplo claro sobre cómo hacer esto.
Tengo una columna de nombres de países de tipo ENUM a la que necesito agregar más países. ¿Cuál es la sintaxis correcta de MySQL para lograr esto?
Aquí está mi intento:
ALTER TABLE carmake CHANGE country country ENUM('Sweden','Malaysia');
El error que obtengo es: ERROR 1265 (01000): Data truncated for column 'country' at row 1.
La country
columna es la columna de tipo ENUM en la declaración anterior.
MOSTRAR CREAR SALIDA DE MESA :
mysql> SHOW CREATE TABLE carmake;
+---------+---------------------------------------------------------------------+
| Table | Create Table
+---------+---------------------------------------------------------------------+
| carmake | CREATE TABLE `carmake` (
`carmake_id` tinyint(4) NOT NULL AUTO_INCREMENT,
`name` tinytext,
`country` enum('Japan','USA','England','Australia','Germany','France','Italy','Spain','Czech Republic','China','South Korea','India') DEFAULT NULL,
PRIMARY KEY (`carmake_id`),
KEY `name` (`name`(3))
) ENGINE=InnoDB AUTO_INCREMENT=49 DEFAULT CHARSET=latin1 |
+---------+---------------------------------------------------------------------+
1 row in set (0.00 sec)
SELECCIONE EL PAÍS DISTINTO DE LA SALIDA DE CARMAKE :
+----------------+
| country |
+----------------+
| Italy |
| Germany |
| England |
| USA |
| France |
| South Korea |
| NULL |
| Australia |
| Spain |
| Czech Republic |
+----------------+
mysql
enums
alter-table
Zaid
fuente
fuente
inplace
desde 10.3.7: mariadb.com/kb/en/library/…Tu código funciona para mí. Aquí está mi caso de prueba:
¿Qué error estás viendo?
FWIW esto también funcionaría:
En realidad, recomendaría una tabla de país en lugar de una columna de enumeración. Es posible que tenga cientos de países que serían una enumeración bastante grande e incómoda.
EDITAR: Ahora que puedo ver tu mensaje de error:
Sospecho que tiene algunos valores en la columna de su país que no aparecen en su
ENUM
. ¿Cuál es el resultado del siguiente comando?OTRA EDICIÓN: ¿Cuál es el resultado del siguiente comando?
Es
STRICT_TRANS_TABLES
oSTRICT_ALL_TABLES
? Eso podría conducir a un error, en lugar de la advertencia habitual que MySQL le daría en esta situación.AÚN OTRA EDICIÓN: Ok, ahora veo que definitivamente tienes valores en la tabla que no están en la nueva
ENUM
. La nuevaENUM
definición solo permite'Sweden'
y'Malaysia'
. La mesa tiene'USA'
,'India'
y varios otros.ÚLTIMA EDICIÓN (QUIZÁS): Creo que estás intentando hacer esto
fuente
carmake
mesa. ¿Podría eso tener algo que ver con eso?La discusión que tuve con Asaph puede no estar clara a medida que avanzábamos un poco.
Pensé que podría aclarar el resultado de nuestro discurso para otros que podrían enfrentar situaciones similares en el futuro para beneficiarse de:
ENUM
Las columnas de tipo son bestias muy difíciles de manipular. Quería agregar dos países (Malasia y Suecia) al conjunto de países existente en mi ENUM.Parece que MySQL 5.1 (que es lo que estoy ejecutando) solo puede actualizar el ENUM redefiniendo el conjunto existente además de lo que quiero:
Esto no funcionó:
La razón fue que la declaración de MySQL estaba reemplazando el ENUM existente por otro que contenía las entradas
'Malaysia'
y'Sweden'
solo. MySQL arrojó un error porque lacarmake
tabla ya tenía valores como'England'
y'USA'
que no formaban parte de la nuevaENUM
definición.Sorprendentemente, lo siguiente tampoco funcionó:
Resulta que incluso el orden de los elementos de los existentes
ENUM
necesita ser preservado mientras se le agregan nuevos miembros. Entonces, si mi existente seENUM
parece a algo asíENUM('England','USA')
, entonces mi nuevoENUM
debe definirse comoENUM('England','USA','Sweden','Malaysia')
y noENUM('USA','England','Sweden','Malaysia')
. Este problema solo se manifiesta cuando hay registros en la tabla existente que usan'USA'
o'England'
valores.LÍNEA DE FONDO:
Solo use
ENUM
s cuando no espere que su conjunto de miembros cambie una vez definido. De lo contrario, las tablas de búsqueda son mucho más fáciles de actualizar y modificar.fuente
En la versión del servidor MYSQL: 5.0.27 probé esto y funcionó bien para mí verificar su versión
fuente
FYI: Una herramienta de simulación útil - phpMyAdmin con Wampserver 3.0.6 - Vista previa de SQL: uso 'Vista previa de SQL' para ver el código SQL que se generaría antes de guardar la columna con el cambio a ENUM. Vista previa de SQL
Arriba puede ver que he ingresado 'Ford', 'Toyota' en el ENUM pero obtengo la sintaxis ENUM (0) que genera un error de sintaxis Error de consulta 1064 #
Luego copio y pego y modifico el SQL y lo ejecuto a través de SQL con un resultado positivo.
SQL cambiado
Esta es una solución rápida que uso con frecuencia y también se puede usar en los valores ENUM existentes que deben modificarse. Pensé que esto podría ser útil.
fuente
Aquí hay otra forma ...
Agrega "otros" a la definición de enumeración de la columna "rtipo" de la tabla "firmas".
fuente
Es posible si crees. Jeje. Prueba este código.
Antes de agregar nuevo valor
Después de agregar un nuevo valor
fuente