Skip to main content

使用MySQL枚举数据类型的全面指南

MySQL枚举数据类型简介

在MySQL中,枚举是一个字符串对象,其值从创建列时定义的允许值列表中选择。

ENUM数据类型具有以下优点:

要定义枚举列,请使用以下语法:

CREATE TABLE table_name (
...
col ENUM ('value1','value2','value3'),
...
);

在这种语法中,可以有三个以上的枚举值。但是,将枚举值的数量保持在20以下是一种良好的做法。

让我们看看下面的例子。

假设,我们必须按优先级存储票证信息:低、中、高。要将优先级列指定为枚举类型,请使用以下CREATE TABLE语句:

CREATE TABLE tickets (
id INT PRIMARY KEY AUTO_INCREMENT,
title VARCHAR(255) NOT NULL,
priority ENUM('Low', 'Medium', 'High') NOT NULL
);

优先级列只接受三个值:低、中和高。在幕后,MySQL将每个枚举成员映射到一个数字索引。在本例中,低、中和高分别映射为1、2和3。

插入MySQL枚举值

要将数据插入枚举列,请使用预定义列表中的枚举值。例如,下面的语句在tickets表中插入新行。

INSERT INTO tickets(title, priority)
VALUES('Scan virus for computer A', 'High');

除了枚举值,还可以使用枚举成员的数字索引将数据插入枚举列。例如,以下语句插入低优先级的新票证:

INSERT INTO tickets(title, priority)
VALUES('Upgrade Windows OS for all computers', 1);

在本例中,我们没有使用低枚举值,而是使用值1。因为Low被映射为1,所以它是可以接受的。

让我们向tickets表中添加更多行:

INSERT INTO tickets(title, priority)
VALUES('Install Google Chrome for Mr. John', 'Medium'),
('Create a new user for the new employee David', 'High');

因为我们将优先级定义为NOTNULL列,所以当您插入新行而不指定优先级列的值时,MySQL将使用第一个枚举成员作为默认值。

见以下声明:

INSERT INTO tickets(title)
VALUES('Refresh the computer of Ms. Lily');

在非严格SQL模式下,如果在枚举列中插入无效值,MySQL将使用数字索引为0的空字符串“”进行插入。如果启用了严格SQL模式,尝试插入无效的枚举值将导致错误。

请注意,如果枚举列被定义为可为NULL的列,则它可以接受NULL值。

筛选MySQL枚举值

以下语句将获取所有高优先级票证:

SELECT 
*
FROM
tickets
WHERE
priority = 'High';

MySQL ENUM - filtering example

由于枚举成员“High”映射到3,因此以下查询返回相同的结果集:

SELECT 
*
FROM
tickets
WHERE
priority = 3;

排序MySQL枚举值

MySQL根据枚举值的索引号对其进行排序。因此,成员的顺序取决于它们在枚举列表中的定义方式。

以下查询选择票据,并按优先级从高到低对其进行排序:

SELECT 
title, priority
FROM
tickets
ORDER BY priority DESC;

MySQL ENUM sorting

按照创建列时希望排序的顺序定义枚举值始终是一种好做法。

MySQL枚举的缺点

MySQL ENUM有以下缺点:

在本教程中,我们向您介绍了MySQL枚举数据类型,以及如何使用它定义存储枚举值的列。