Mysql
 sql >> Base de données >  >> RDS >> Mysql

Création du type de variable ENUM dans MySQL

Non. MySQL ne prend pas en charge CREATE DOMAIN ou CREATE TYPE comme, par exemple, PostgreSQL le fait .

Vous devrez probablement saisir à nouveau tous les noms. Vous pouvez atténuer le travail nécessaire pour le faire en utilisant le copier-coller ou des scripts SQL.

Vous pouvez également utiliser le INFORMATION_SCHEMA tables pour obtenir le texte de la définition ENUM, puis l'interpoler dans un nouveau CREATE TABLE déclaration.

Vous pouvez également utiliser CREATE TABLE AS de manière créative pour copier une définition de type. Voici une démonstration :

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

Sorties :

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

Enfin, je suggère que si votre ENUM contient de nombreuses valeurs (ce qui, je suppose, est vrai puisque vous cherchez une solution pour éviter de les taper), vous devriez probablement utiliser une table de recherche au lieu du type de données ENUM.

Re commentaire de @bliako :

Vous pouvez faire ce que vous décrivez comme suit :

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

J'ai essayé ceci sur MySQL 5.7.27, et cela a fonctionné.

Il est intéressant de noter que vous n'avez pas à déclarer les trois colonnes dans la ligne CREATE TABLE. La troisième colonne f sera ajouté automatiquement.

Il est également intéressant que j'ai dû donner des alias de colonne dans le SELECT pour s'assurer que les noms de colonne correspondent à ceux déclarés dans CREATE TABLE . Sinon, si les noms de colonne ne correspondent pas, vous vous retrouvez avec des colonnes supplémentaires et leurs types de données ne correspondent pas à ce que vous attendiez :

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
)