Creating ENUM variable type in MySQL

enums, mysql, variables

Solution

No. MySQL does not support `CREATE DOMAIN` or `CREATE TYPE` as, for example, PostgreSQL does.

You'll probably have to enter all the names again. You can mitigate the work it takes to do this by using copy & paste, or SQL scripts.

You could also use the `INFORMATION_SCHEMA` tables to get the text of the ENUM definition, and then interpolate that into a new `CREATE TABLE` statement.

You can also use `CREATE TABLE AS` in creative ways to copy a type definition. Here's a demonstration:

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

Outputs:

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

Finally, I suggest that if your ENUM has many values in it (which I'm guessing is true since you're looking for a solution to avoid typing them), you should probably be using a lookup table instead of the ENUM data type.

Re comment from @bliako:

You can do what you describe this way:

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

I tried this on MySQL 5.7.27, and it worked.

It's interesting to note that you don't have to declare all three columns in the CREATE TABLE line. The third column `f` will be added automatically.

It's also interesting that I had to give column aliases in the `SELECT` statement to make sure the column names match those declared in the `CREATE TABLE`. Otherwise if the column names don't match, you end up with extra columns, and their data types are not what you expect:

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
)

Problem

I am using an ENUM data type in MySQL and would like to reuse it, but not retype in the values. Is there an equivalent to the C, C++ way of defining types in MySQL? I would like to do the following: ``` DEFINE ETYPE ENUM('a','b','c','d'); CREATE TABLE Table_1 (item1 ETYPE, item2 ETYPE); ``` Is this possible? Thanks

Original source