sql >> Base de Datos >  >> RDS >> Mysql

Crear tipo de variable ENUM en MySQL

No. MySQL no admite CREATE DOMAIN o CREATE TYPE como, por ejemplo, PostgreSQL .

Probablemente tendrá que ingresar todos los nombres nuevamente. Puede mitigar el trabajo que se necesita para hacer esto usando copiar y pegar, o secuencias de comandos SQL.

También puede usar el INFORMATION_SCHEMA tablas para obtener el texto de la definición ENUM y luego interpolarlo en una nueva CREATE TABLE declaración.

También puede usar CREATE TABLE AS en formas creativas para copiar una definición de tipo. Aquí hay una demostración:

CREATE TABLE foo ( f ENUM('abc', 'xyz') );
CREATE TABLE bar AS SELECT f AS b FROM foo;
SHOW CREATE TABLE bar;

Salidas:

CREATE TABLE `bar` (
  `b` enum('abc','xyz') default NULL
) 

Finalmente, sugiero que si su ENUM tiene muchos valores (lo cual supongo que es cierto ya que está buscando una solución para evitar escribirlos), probablemente debería usar una tabla de búsqueda en lugar del tipo de datos ENUM.

Re comentario de @bliako:

Puede hacer lo que describe de esta manera:

CREATE TABLE bar (pop INT NOT NULL, name VARCHAR(100))
AS SELECT 0 AS pop, NULL AS name, f FROM foo;

Intenté esto en MySQL 5.7.27 y funcionó.

Es interesante notar que no tiene que declarar las tres columnas en la línea CREAR TABLA. La tercera columna f se agregará automáticamente.

También es interesante que tuve que dar alias de columna en SELECT para asegurarse de que los nombres de las columnas coincidan con los declarados en CREATE TABLE . De lo contrario, si los nombres de las columnas no coinciden, terminará con columnas adicionales y sus tipos de datos no serán los esperados:

create table bar (pop int not null, name varchar(100)) 
as select 0 as c1, null as c2, f from foo;

show create table bar\G

CREATE TABLE `bar` (
  `pop` int(11) NOT NULL,
  `name` varchar(100) DEFAULT NULL,
  `c1` binary(0) DEFAULT NULL,
  `c2` binary(0) DEFAULT NULL,
  `f` enum('abc','xyz') DEFAULT NULL
)