Mysql 简明教程

MySQL - ENUM

ENUM (枚举) 是一个用户定义的数据类型, 它将值列表存储为字符串。在定义 ENUM 列时指定这些值。用户可以在插入值到此列时从此预定义列表中选择值。

在 ENUM 列中定义的每个字符串值隐式分配一个从 1 开始的数值。MySQL 在内部使用这些数值来表示 ENUM 值。

The MySQL ENUM Data Type

MySQL ENUM 数据类型允许你在插入或更新操作期间从预定义列表中选择一个或多个值。选定的值以字符串的形式存储在表中, 当你从 ENUM 列中检索数据时, 这些值会以人类可读的格式显示。

Syntax

以下是为列定义 ENUM 数据类型的语法 −

CREATE TABLE table_name (
   Column1,
   Column2 ENUM ('value1','value2','value3', ...),
   Column3...
);

Note: 一个枚举列最多可以有 65,535 个值。

Attributes of ENUM

MySQL 中的 ENUM 数据类型有三个属性。如下所述 −

  1. Default − 枚举数据类型的默认值为 NULL。如果在插入时没有为枚举字段提供值,则会插入 Null 值。

  2. NULL − 如果为枚举字段设置此属性,则其作用与 DEFAULT 值相同。如果已设置,则索引值始终为 NULL。

  3. NOT NULL − 如果为枚举字段设置此属性,并且在插入时未提供值,则 MySQL 会生成警告消息。

Example

首先,让我们创建一个名为 STUDENTS 的表。在此表中,我们使用以下查询在 BRANCH 列中指定 ENUM 字符串对象 −

CREATE TABLE STUDENTS (
   ID int NOT NULL AUTO_INCREMENT,
   NAME varchar(30) NOT NULL,
   BRANCH ENUM ('CSE', 'ECE', 'MECH'),
   FEES int NOT NULL,
   PRIMARY KEY (ID)
);

以下是所获得的输出 −

Query OK, 0 rows affected (0.04 sec)

现在,我们检索 STUDENTS 表的结构,显示“BRANCH”字段具有枚举数据类型 −

DESCRIBE STUDENTS;

输出显示 BRANCH 字段的数据类型为 ENUM,用于存储值 ('CSE', 'ECE', 'MECH') −

现在,让我们使用以下 INSERT 查询向 STUDENTS 表中插入记录 −

INSERT INTO STUDENTS (NAME, BRANCH, FEES) VALUES
('Anirudh', 'CSE', 500000),
('Yuvan', 'ECE', 350000),
('Harris', 'MECH', 400000);

在这些插入查询中,我们已对“BRANCH”字段使用了值 ('CSE', 'ECE' 和 'MECH'),这些是有效的枚举值。因此,查询在未出现任何错误的情况下执行 −

Query OK, 3 rows affected (0.01 sec)
Records: 3  Duplicates: 0  Warnings: 0

使用以下查询,我们可以显示表中的所有值 −

SELECT * FROM STUDENTS;

以下是 STUDENTS 表的记录 −

Inserting Records with Numerical ENUM Values

我们可以使用相应的数字索引将枚举列表值插入表中的 ENUM 列。数字索引从 1 开始,而不是从 0 开始。

Example

在下面的查询中,我们使用其数字索引将值 'CSE' 从 ENUM 列表插入到 'BRANCH' 列中。由于 'CSE' 在 ENUM 列表中的位置为 1,因此我们在查询中使用 1 作为数字索引。

INSERT INTO STUDENTS (NAME, BRANCH, FEES) VALUES
('Devi', 1, 380000);

Output

插入查询在未出现任何错误的情况下执行 −

Query OK, 1 row affected (0.01 sec)

Verification

让我们通过使用以下查询检索表的全部记录来验证上述插入是否成功 −

SELECT * FROM STUDENTS;

显示的 STUDENTS 表如下 −

Inserting Invalid Records

在 MySQL 中,如果我们尝试将不匹配任何指定枚举值的值插入到具有 ENUM 数据类型的列中,则会导致错误。

Example

在以下查询中,我们引用了枚举列表中不存在的第 6 个值。因此,以下查询将生成错误 −

INSERT INTO STUDENTS (NAME, BRANCH, FEES) VALUES
('Thaman', 6, 200000);

Output

正如我们看到的输出,生成了错误,并且没有插入任何新记录 −

ERROR 1265 (01000): Data truncated for column 'BRANCH' at row 1

Filtering Records by Numeric ENUM Value

在 MySQL 中,您可以根据字符串值或数字索引从 ENUM 列中检索记录。数字索引从 1 开始,而不是从 0 开始。

Example

枚举列表中 1 的数字索引为“CSE”。因此,下面的查询将获取其中 BRANCH 列包含值为“CSE”的记录。

SELECT * FROM STUDENTS WHERE BRANCH = 1;

Output

结果输出显示其中“BRANCH”列包含值“CSE”的记录:

Filtering Records by Human-Readable ENUM Value

在某些情况下,枚举列表将具有大量的值。记住列表中每个值数字索引可能很困难。在这种情况下,在查询中使用 ENUM 项可读字符串值来根据 ENUM 字段值检索记录更加方便。

Example

在以下查询中,我们正在筛选其中 BRANCH 列包含值“Mech”的记录。

SELECT * FROM STUDENTS WHERE BRANCH = "MECH";

Output

以下是所获得的输出 −

Disadvantages of ENUM Data Type

以下是 MySQL 中 ENUM 数据类型有以下缺点:

  1. 如果我们希望修改枚举列表中的值,则需要使用 ALTER TABLE 命令重新创建整个表,这在使用资源和时间方面相当昂贵。

  2. 非常复杂才能获得完整的枚举列表,因为我们需要访问 inform_schema 数据库。

  3. 不能使用枚举值和表达式。例如,下面的 CREATE 语句将返回一个错误,因为它使用 CONCAT() 函数创建枚举值:

CREATE TABLE Students (
   ID int PRIMARY KEY AUTO_INCREMENT,
   NAME varchar(30),
   BRANCH ENUM('CSE', CONCAT('ME','CH'))
);

用户变量不能用于枚举值。例如,请看以下查询:

mysql> SET @mybranch = 'EEE';
mysql> CREATE TABLE Students (
   ID int PRIMARY KEY AUTO_INCREMENT,
   NAME varchar(30),
   BRANCH ENUM('CSE', 'MECH', @mybranch)
);

建议不要将数字值用作枚举值。

Enum Datatypes Using a Client Program

我们还可以使用客户端程序创建 Enum 数据类型的列。

Syntax

Example

以下是这些程序 −