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

Oprettelse af ENUM-variabeltype i MySQL

Nej. MySQL understøtter ikke CREATE DOMAIN eller CREATE TYPE som for eksempel PostgreSQL gør .

Du skal sandsynligvis indtaste alle navnene igen. Du kan mindske det arbejde, det kræver at gøre dette ved at bruge copy &paste eller SQL-scripts.

Du kan også bruge INFORMATION_SCHEMA tabeller for at få teksten til ENUM-definitionen, og derefter interpolere den til en ny CREATE TABLE erklæring.

Du kan også bruge CREATE TABLE AS på kreative måder at kopiere en typedefinition. Her er en demonstration:

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

Udgange:

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

Til sidst foreslår jeg, at hvis din ENUM har mange værdier i sig (hvilket jeg gætter på er sandt, da du leder efter en løsning for at undgå at skrive dem), skal du nok bruge en opslagstabel i stedet for ENUM-datatypen.

Re kommentar fra @bliako:

Du kan gøre, hvad du beskriver på denne måde:

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

Jeg prøvede dette på MySQL 5.7.27, og det virkede.

Det er interessant at bemærke, at du ikke behøver at erklære alle tre kolonner i linjen CREATE TABLE. Den tredje kolonne f tilføjes automatisk.

Det er også interessant, at jeg var nødt til at give kolonnealiaser i SELECT sætning for at sikre, at kolonnenavnene matcher dem, der er erklæret i CREATE TABLE . Ellers, hvis kolonnenavnene ikke stemmer overens, ender du med ekstra kolonner, og deres datatyper er ikke, hvad du forventer:

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. Hvordan UNDTAGET virker i PostgreSQL

  2. Er SELECT eller INSERT i en funktion tilbøjelig til raceforhold?

  3. Sessionsvariabler:Hvor meget data er for meget?

  4. Kan ikke opdatere række i Sqlite i Android, men giver ingen fejl