sql >> Database >  >> RDS >> Mysql

ENUM-variabelentype maken in MySQL

Nee. MySQL biedt geen ondersteuning voor CREATE DOMAIN of CREATE TYPE zoals bijvoorbeeld PostgreSQL doet .

U zult waarschijnlijk alle namen opnieuw moeten invoeren. U kunt het werk dat nodig is om dit te doen verminderen door kopiëren en plakken of SQL-scripts te gebruiken.

U kunt ook de INFORMATION_SCHEMA . gebruiken tabellen om de tekst van de ENUM-definitie te krijgen en die vervolgens te interpoleren in een nieuwe CREATE TABLE verklaring.

U kunt ook CREATE TABLE AS . gebruiken op creatieve manieren een typedefinitie kopiëren. Hier is een demonstratie:

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

Uitgangen:

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

Ten slotte stel ik voor dat als je ENUM veel waarden bevat (wat naar ik vermoed waar is omdat je een oplossing zoekt om ze niet te hoeven typen), je waarschijnlijk een opzoektabel zou moeten gebruiken in plaats van het ENUM-gegevenstype.

Re reactie van @bliako:

Je kunt op deze manier doen wat je beschrijft:

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

Ik heb dit geprobeerd op MySQL 5.7.27 en het werkte.

Het is interessant om op te merken dat u niet alle drie de kolommen in de regel CREATE TABLE hoeft te declareren. De derde kolom f wordt automatisch toegevoegd.

Het is ook interessant dat ik kolomaliassen moest geven in de SELECT instructie om ervoor te zorgen dat de kolomnamen overeenkomen met de namen die zijn opgegeven in de CREATE TABLE . Als de kolomnamen niet overeenkomen, krijg je extra kolommen en zijn hun gegevenstypen niet wat je verwacht:

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. Wat is het PDO-equivalent van de functie mysql_real_escape_string?

  2. Hoe de weergave in MySQL te updaten

  3. MySQL PHP-incompatibiliteit

  4. ID ophalen van een voorwaardelijke INSERT