sql >> Databasteknik >  >> RDS >> Mysql

Skapar ENUM-variabeltyp i MySQL

Nej. MySQL stöder inte CREATE DOMAIN eller CREATE TYPE som till exempel PostgreSQL gör .

Du måste förmodligen ange alla namn igen. Du kan minska det arbete som krävs för att göra detta genom att använda kopiera och klistra in eller SQL-skript.

Du kan också använda INFORMATION_SCHEMA tabeller för att få texten i ENUM-definitionen och sedan interpolera den till en ny CREATE TABLE uttalande.

Du kan också använda CREATE TABLE AS på kreativa sätt att kopiera en typdefinition. Här är en demonstration:

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

Utgångar:

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

Slutligen föreslår jag att om din ENUM har många värden i sig (vilket jag gissar är sant eftersom du letar efter en lösning för att undvika att skriva dem), bör du förmodligen använda en uppslagstabell istället för datatypen ENUM.

Om kommentar från @bliako:

Du kan göra det du beskriver så här:

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

Jag provade detta på MySQL 5.7.27, och det fungerade.

Det är intressant att notera att du inte behöver deklarera alla tre kolumnerna på raden CREATE TABLE. Den tredje kolumnen f läggs till automatiskt.

Det är också intressant att jag var tvungen att ge kolumnalias i SELECT för att se till att kolumnnamnen matchar de som deklareras i CREATE TABLE . Annars, om kolumnnamnen inte stämmer överens, får du extra kolumner, och deras datatyper är inte vad du förväntar dig:

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
)


  1. [Video] Ansible och PostgreSQL

  2. På radera kaskad för självreferenstabell

  3. Strängdata, höger trunkerad:1406 Data för lång för kolumn

  4. Finns det några SQL-validatorer som kan kontrollera syntax mot flera databasservrar?