que - select enum mysql
¿Cómo agrego más miembros a mi columna de tipo ENUM en MySQL? (6)
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 recibo es: ERROR 1265 (01000): Data truncated for column ''country'' at row 1.
La columna de country
es la columna de tipo ENUM en la declaración anterior.
SHOW CREATE TABLE OUTPUT:
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)
SELECCIONAR país DISTINCT FROM carmake OUTPUT:
+----------------+
| country |
+----------------+
| Italy |
| Germany |
| England |
| USA |
| France |
| South Korea |
| NULL |
| Australia |
| Spain |
| Czech Republic |
+----------------+
En la versión del servidor MYSQL: 5.0.27 intenté esto y funcionó bien para mí verificar su versión
ALTER TABLE carmake
MODIFY `country` ENUM(''Japan'', ''USA'', ''England'', ''Australia'', ''Germany'', ''France'', ''Italy'', ''Spain'', ''Czech Republic'', ''China'', ''South Korea'', ''India'', ''Sweden'', ''Malaysia'');
Es posible si crees. Jeje. prueba este código
public function add_new_enum($new_value)
{
$table="product";
$column="category";
$row = $this->db->query("SELECT COLUMN_TYPE FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = ? AND COLUMN_NAME = ?", array($table, $column))->row_array();
$old_category = array();
$new_category="";
foreach (explode('','', str_replace("''", '''', substr($row[''COLUMN_TYPE''], 5, (strlen($row[''COLUMN_TYPE'']) - 6)))) as $val)
{
//getting the old category first
$old_category[$val] = $val;
$new_category.="''".$old_category[$val]."''".",";
}
//after the end of foreach, add the $new_value to $new_category
$new_category.="''".$new_value."''";
//Then alter the table column with the new enum
$this->db->query("ALTER TABLE product CHANGE category category ENUM($new_category)");
}
FYI: una herramienta de simulación útil - phpMyAdmin con Wampserver 3.0.6 - Vista previa de SQL: uso ''Preview 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 ve que he introducido ''Ford'', ''Toyota'' en el ENUM pero obtengo la sintaxis ENUM (0) que genera 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.
Esta es una solución rápida que uso a menudo y también se puede usar en valores ENUM existentes que deben modificarse. Pensé que esto podría ser útil.
La discussion que tuve con Asaph puede no ser clara de seguir mientras avanzamos y retrocedimos 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
columnas de tipo ENUM
son bestias muy difíciles de manipular. Quería agregar dos países (Malasia y Suecia) al conjunto existente de países 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ó:
ALTER TABLE carmake CHANGE country country ENUM(''Sweden'',''Malaysia'') DEFAULT NULL;
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''
solamente. MySQL arrojó un error porque la tabla de carmake
ya tenía valores como ''England''
y ''USA''
Que no formaban parte de la definición del nuevo ENUM
.
Sorprendentemente, lo siguiente tampoco funcionó:
ALTER TABLE carmake CHANGE country country ENUM(''Australia'',''England'',''USA''...''Sweden'',''Malaysia'') DEFAULT NULL;
Resulta que incluso el orden de los elementos del ENUM
existente debe preservarse al agregar nuevos miembros al mismo. Entonces, si mi ENUM
actual se parece a ENUM(''England'',''USA'')
, Entonces mi nuevo ENUM
debe definirse como ENUM(''England'',''USA'',''Sweden'',''Malaysia'')
y no ENUM(''USA'',''England'',''Sweden'',''Malaysia'')
. Este problema solo se manifiesta cuando hay registros en la tabla existente que usan valores ''USA''
o ''England''
.
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.
Tu código funciona para mí. Aquí está mi caso de prueba:
mysql> CREATE TABLE carmake (country ENUM(''Canada'', ''United States''));
Query OK, 0 rows affected (0.00 sec)
mysql> SHOW CREATE TABLE carmake;
+---------+-------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+---------+-------------------------------------------------------------------------------------------------------------------------+
| carmake | CREATE TABLE `carmake` (
`country` enum(''Canada'',''United States'') default NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1 |
+---------+-------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
mysql> ALTER TABLE carmake CHANGE country country ENUM(''Sweden'',''Malaysia'');
Query OK, 0 rows affected (0.53 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> SHOW CREATE TABLE carmake;
+---------+--------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+---------+--------------------------------------------------------------------------------------------------------------------+
| carmake | CREATE TABLE `carmake` (
`country` enum(''Sweden'',''Malaysia'') default NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1 |
+---------+--------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
¿Qué error estás viendo?
FWIW esto también funcionaría:
ALTER TABLE carmake MODIFY COLUMN country ENUM(''Sweden'',''Malaysia'');
De hecho, recomendaría una tabla de países en lugar de una columna enum. Puede tener cientos de países que conformarían una enumeración bastante grande y torpe.
EDITAR: Ahora que puedo ver tu mensaje de error:
ERROR 1265 (01000): Data truncated for column ''country'' at row 1.
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?
SELECT DISTINCT country FROM carmake;
OTRA EDICIÓN: ¿Cuál es el resultado del siguiente comando?
SHOW VARIABLES LIKE ''sql_mode'';
¿Es STRICT_TRANS_TABLES
o STRICT_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: Bien, ahora veo que definitivamente tienes valores en la tabla que no están en el nuevo ENUM
. La nueva definición ENUM
solo permite ''Sweden''
y ''Malaysia''
. La tabla tiene ''USA''
, ''India''
y varios otros.
ÚLTIMA EDICIÓN (QUIZÁ): Creo que estás tratando de hacer esto:
ALTER TABLE carmake CHANGE country country ENUM(''Italy'', ''Germany'', ''England'', ''USA'', ''France'', ''South Korea'', ''Australia'', ''Spain'', ''Czech Republic'', ''Sweden'', ''Malaysia'') DEFAULT NULL;
ALTER TABLE
`table_name`
MODIFY COLUMN
`column_name2` enum(
''existing_value1'',
''existing_value2'',
''new_value1'',
''new_value2''
)
NOT NULL AFTER `column_name1`;