Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Criando o tipo de variável ENUM no MySQL


Não. O MySQL não suporta CREATE DOMAIN ou CREATE TYPE como, por exemplo, PostgreSQL faz .

Você provavelmente terá que digitar todos os nomes novamente. Você pode reduzir o trabalho necessário para fazer isso usando copiar e colar ou scripts SQL.

Você também pode usar o INFORMATION_SCHEMA tabelas para obter o texto da definição ENUM e, em seguida, interpolar isso em um novo CREATE TABLE demonstração.

Você também pode usar CREATE TABLE AS de maneiras criativas para copiar uma definição de tipo. Aqui está uma demonstração:
CREATE TABLE foo ( f ENUM('abc', 'xyz') );
CREATE TABLE bar AS SELECT f AS b FROM foo;
SHOW CREATE TABLE bar;

Saídas:
CREATE TABLE `bar` (
  `b` enum('abc','xyz') default NULL
) 

Por fim, sugiro que, se o seu ENUM tiver muitos valores (o que acho que é verdade, pois você está procurando uma solução para evitar digitá-los), provavelmente deve usar uma tabela de pesquisa em vez do tipo de dados ENUM.

Comentário de @bliako:

Você pode fazer o que você descreve desta maneira:
CREATE TABLE bar (pop INT NOT NULL, name VARCHAR(100))
AS SELECT 0 AS pop, NULL AS name, f FROM foo;

Eu tentei isso no MySQL 5.7.27 e funcionou.

É interessante notar que você não precisa declarar todas as três colunas na linha CREATE TABLE. A terceira coluna f será adicionado automaticamente.

Também é interessante que eu tive que fornecer aliases de coluna no SELECT para garantir que os nomes das colunas correspondam aos declarados no CREATE TABLE . Caso contrário, se os nomes das colunas não corresponderem, você acabará com colunas extras e seus tipos de dados não são o que você espera:
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
)