Mysql
 sql >> Database >  >> RDS >> Mysql

Creazione di un tipo di variabile ENUM in MySQL

No. MySQL non supporta CREATE DOMAIN o CREATE TYPE come, ad esempio, PostgreSQL fa .

Probabilmente dovrai inserire di nuovo tutti i nomi. Puoi ridurre il lavoro necessario per farlo utilizzando copia e incolla o script SQL.

Puoi anche usare INFORMATION_SCHEMA tabelle per ottenere il testo della definizione ENUM, quindi interpolarlo in un nuovo CREATE TABLE dichiarazione.

Puoi anche usare CREATE TABLE AS in modi creativi per copiare una definizione di tipo. Ecco una dimostrazione:

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

Uscite:

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

Infine, suggerisco che se il tuo ENUM contiene molti valori (che suppongo sia vero poiché stai cercando una soluzione per evitare di digitarli), probabilmente dovresti utilizzare una tabella di ricerca anziché il tipo di dati ENUM.

Commento di @bliako:

Puoi fare ciò che descrivi in ​​questo modo:

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

L'ho provato su MySQL 5.7.27 e ha funzionato.

È interessante notare che non è necessario dichiarare tutte e tre le colonne nella riga CREATE TABLE. La terza colonna f verrà aggiunto automaticamente.

È anche interessante che ho dovuto fornire alias di colonna in SELECT per assicurarsi che i nomi delle colonne corrispondano a quelli dichiarati in CREATE TABLE . Altrimenti, se i nomi delle colonne non corrispondono, ti ritroverai con colonne extra e i loro tipi di dati non sono quelli che ti aspetti:

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
)