MySQL Tutorial/Data Types/ENUM
Содержание
ENUM Type
The ENUM type is an enumerated list.
A column can only store one of the values that are declared in the given list.
An ENUM is a string object with a value chosen from a list of values that are enumerated at table creation time.
An enumeration value must be a quoted string literal.
<source lang="sql">
mysql> mysql> CREATE TABLE Test(
-> NY ENUM("Y","N") DEFAULT "N", -> Size ENUM("S","M","L","XL","XXL"), -> Color ENUM("Black","Red","White") -> );
Query OK, 0 rows affected (0.02 sec) mysql> mysql> Insert into Test (NY, Size, Color) values ("Y","S","Black"); Query OK, 1 row affected (0.02 sec) mysql> mysql> select * from Test; +------+------+-------+ | NY | Size | Color | +------+------+-------+ | Y | S | Black | +------+------+-------+ 1 row in set (0.00 sec) mysql> mysql> drop table Test; Query OK, 0 rows affected (0.00 sec) mysql> mysql></source>
You may have up to 65,535 items in your enumerated list.
An ENUM type must either contain a value from the list or NULL.
If you try to insert a value that is not in the list, a blank value will inserted.
ENUM with default value
<source lang="sql">
mysql> mysql> CREATE TABLE Employee (
-> ID INT NOT NULL PRIMARY KEY AUTO_INCREMENT, -> First_Name VARCHAR(20) NOT NULL, -> Last_Name VARCHAR(30) NOT NULL, -> Age INT, -> Gender ENUM("M", "F") DEFAULT "F", -> Favorite_Activity ENUM("Programming", "Eating","Biking", "Running", "None") DEFAULT "None" -> );
Query OK, 0 rows affected (0.05 sec) mysql> mysql> desc Employee; +-------------------+--------------------------------------------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------------------+--------------------------------------------------------+------+-----+---------+----------------+ | ID | int(11) | NO | PRI | NULL | auto_increment | | First_Name | varchar(20) | NO | | | | | Last_Name | varchar(30) | NO | | | | | Age | int(11) | YES | | NULL | | | Gender | enum("M","F") | YES | | F | | | Favorite_Activity | enum("Programming","Eating","Biking","Running","None") | YES | | None | | +-------------------+--------------------------------------------------------+------+-----+---------+----------------+ 6 rows in set (0.01 sec) mysql> mysql> drop table Employee; Query OK, 0 rows affected (0.00 sec) mysql></source>
If you retrieve an ENUM value in a numeric context, the column value"s index is returned
<source lang="sql">
SELECT enum_col+0 FROM tbl_name;</source>
Inserting data to ENUM type column
<source lang="sql">
mysql> mysql> mysql> CREATE TABLE Classes
-> ( -> ClassID SMALLINT NOT NULL PRIMARY KEY, -> Dept CHAR(4) NOT NULL, -> Level ENUM("Upper", "Lower") NOT NULL, -> TotalStudents TINYINT UNSIGNED NOT NULL -> );
Query OK, 0 rows affected (0.05 sec) mysql> mysql> mysql> INSERT INTO Classes VALUES (1001, "ANTH", "Upper", 25),
-> (1002, "ANTH", "Upper", 25), -> (1003, "MATH", "Upper", 18), -> (1004, "ANTH", "Lower", 19), -> (1005, "ENGL", "Upper", 28), -> (1006, "MATH", "Lower", 23), -> (1007, "ENGL", "Upper", 25), -> (1008, "MATH", "Lower", 29), -> (1009, "ANTH", "Upper", 25), -> (1010, "ANTH", "Lower", 30), -> (1011, "ENGL", "Lower", 26), -> (1012, "MATH", "Lower", 22), -> (1013, "ANTH", "Upper", 27), -> (1014, "ANTH", "Upper", 21), -> (1015, "ENGL", "Lower", 25), -> (1016, "ENGL", "Upper", 32);
Query OK, 16 rows affected (0.01 sec) Records: 16 Duplicates: 0 Warnings: 0 mysql> mysql> mysql> select * from Classes; +---------+------+-------+---------------+ | ClassID | Dept | Level | TotalStudents | +---------+------+-------+---------------+ | 1001 | ANTH | Upper | 25 | | 1002 | ANTH | Upper | 25 | | 1003 | MATH | Upper | 18 | | 1004 | ANTH | Lower | 19 | | 1005 | ENGL | Upper | 28 | | 1006 | MATH | Lower | 23 | | 1007 | ENGL | Upper | 25 | | 1008 | MATH | Lower | 29 | | 1009 | ANTH | Upper | 25 | | 1010 | ANTH | Lower | 30 | | 1011 | ENGL | Lower | 26 | | 1012 | MATH | Lower | 22 | | 1013 | ANTH | Upper | 27 | | 1014 | ANTH | Upper | 21 | | 1015 | ENGL | Lower | 25 | | 1016 | ENGL | Upper | 32 | +---------+------+-------+---------------+ 16 rows in set (0.00 sec) mysql> mysql> drop table Classes; Query OK, 0 rows affected (0.00 sec)</source>
Possible value for a ENUM column
A column specified as ENUM("one", "two", "three") can have any of the values shown here
The index of each value is also shown:
Value Index NULL NULL "" 0 "one" 1 "two" 2 "three" 3
Use ENUM type column
<source lang="sql">
mysql> mysql> CREATE TABLE employee (
-> grp ENUM("A","B","C") NOT NULL, -> id MEDIUMINT NOT NULL AUTO_INCREMENT, -> name CHAR(30) NOT NULL, -> PRIMARY KEY (grp,id) -> );
Query OK, 0 rows affected (0.03 sec) mysql> mysql> INSERT INTO employee (grp,name) VALUES ("A","A1"),
-> ("B","B1"), -> ("C","C1"), -> ("A","A2"), -> ("B","B2"), -> ("C","C2");
Query OK, 6 rows affected (0.01 sec) Records: 6 Duplicates: 0 Warnings: 0 mysql> mysql> SELECT * FROM employee ORDER BY grp,id; +-----+----+------+ | grp | id | name | +-----+----+------+ | A | 1 | A1 | | A | 2 | A2 | | B | 1 | B1 | | B | 2 | B2 | | C | 1 | C1 | | C | 2 | C2 | +-----+----+------+ 6 rows in set (0.00 sec) mysql> mysql> mysql> drop table employee; Query OK, 0 rows affected (0.00 sec) mysql></source>
Use numeric operation in ENUM type column
<source lang="sql">
mysql> mysql> mysql> CREATE TABLE Test(
-> XY ENUM("Y","N") DEFAULT "N", -> Size ENUM("S","M","L","XL","XXL"), -> Color ENUM("Black","Red","White") -> );
Query OK, 0 rows affected (0.03 sec) mysql> mysql> Insert into Test (XY, Size, Color) values ("Y","S","Black"); Query OK, 1 row affected (0.01 sec) mysql> mysql> select * from Test; +------+------+-------+ | XY | Size | Color | +------+------+-------+ | Y | S | Black | +------+------+-------+ 1 row in set (0.00 sec) mysql> mysql> select * from Test where size = 0; Empty set (0.02 sec) mysql> mysql> drop table Test; Query OK, 0 rows affected (0.00 sec) mysql></source>