MySQL 入门教程
  • 教程目录
  • 第一章 基础教程
    • 第一节 入门
      • 1.1 安装
      • 1.2 示例数据库
    • 第二节 查询数据
      • 2.1 SELECT 语句
      • 2.2 SELECT DISTINCT 语句
    • 第三节 过滤数据
      • 3.1 WHERE 子句
      • 3.2 AND 运算符
      • 3.3 OR 运算符
      • 3.4 IN 运算符
      • 3.5 BETWEEN 运算符
      • 3.6 LIKE 运算符
      • 3.7 LIMIT 子句
      • 3.8 IS NULL 运算符
    • 第四节 数据排序
      • 4.1 ORDER BY 子句
      • 4.1 自然排序
    • 第五节 连接表
      • 5.1 别名
      • 5.2 INNER JOIN
      • 5.3 LEFT JOIN
      • 5.4 自连接
      • 5.5 CROSS JOIN
    • 第六节 分组数据
      • 6.1 GROUP BY子句
      • 6.2 HAVING 子句
    • 第七节 子查询,派生表和通用表达式
      • 7.1 子查询
      • 7.2 派生表
      • 7.3 公共表表达式
      • 7.4 递归 CTE
    • 第八节 集合操作符
      • 8.1 UNION 和 UNION ALL
      • 8.2 INTERSECT 模拟
    • 第九节 修改数据
      • 9.1 INSERT 语句
      • 9.2 INSERT IGNORE
      • 9.3 UPDATE 语句
      • 9.4 UPDATE JOIN 语句
      • 9.5 DELETE
      • 9.6 ON DELETE CASCADE.
      • 9.7 DELETE JOIN
      • 9.8 REPLACE 语句
      • 9.9 PREPARE 语句
    • 第十节 事务
      • 10.1 事务介绍
      • 10.2 表锁定
    • 第十一节 管理数据库和表
      • 11.1 数据库管理
      • 11.2 MySQL 表类型
      • 11.3 CREATE TABLE
      • 11.4 序列
      • 11.5 ALTER TABLE
      • 11.6 重命名表
      • 11.7 从表中删除列
      • 11.8 向表中添加新列
      • 11.9 删除表
      • 11.10 临时表
      • 11.11 TRUNCATE TABLE
    • 第十二节 索引
      • 12.1 管理索引
      • 12.1 UNIQUE 索引
    • 第十三节 数据类型
      • 13.1 INT
      • 13.2 DECIMAL
      • 13.3 BIT
      • 13.4 BOOLEAN
      • 13.5 CHAR
      • 13.6 VARCHAR
      • 13.7 TEXT
      • 13.8 DATE
      • 13.9 TIME
      • 13.10 DATETIME
      • 13.11 TIMESTAMP
      • 13.12 JSON
      • 13.13 ENUM
    • 第十四节 约束
      • 14.1 NOT NULL 约束
      • 14.2 主键约束
      • 14.2 外键约束
      • 14.4 UNIQUE 约束
      • 14.5 CHECK 约束
    • 第十五节 全球化
      • 15.1 字符集
      • 15.2 校对规则
    • 第十六节 导入和导出
      • 16.1 导入 CSV 文件
      • 16.2 导出为 CSV
  • 第二章 技巧
    • CTE 简介
    • 递归 CTE
    • 邻接列表模型和层次结构
    • 获取行数
    • 比较表
    • 找重复值
    • 删除重复行
    • UUID 和主键
    • 复制表数据
    • 变量
    • 生成列
    • 连续行比较
    • 更改存储引擎
    • 基于正则表达式的搜索
    • row_number 模拟
    • 随机选择记录
    • 选择第 n 个最高纪录
    • 重置自动增量值
    • MariaDB 与 MySQL 比较
    • 间隔
    • NULL 详细和应用
    • 获取今天的日期
    • 将NULL值映射到有意义的值
    • 注释
  • 第三章 存储过程
    • 简介
    • 入门
    • 变量
    • 参数
    • 返回多个值
    • IF语句
    • CASE语句
    • IF和CASE语句的技巧
    • 循环
    • 游标
    • 列出存储过程
    • 错误处理
    • SIGNAL 和 ESIGNAL 语句
    • 存储函数
  • 第四章 触发器
    • 实现
    • 创建
    • 创建多个触发器
    • 管理
    • 计划事件
    • 修改事件
  • 第五章 视图
    • 简介
    • 实现和限制
    • 创建
    • 可更新视图
    • 确保视图一致性
    • 检查选项子句
    • 管理
  • 第六章 全文搜索
    • 简介
    • 定义索引
    • 自然语言全文搜索
    • 布尔全文搜索
    • 查询扩展
    • ngram全文解析器
  • 第七章 函数
  • 第八章 管理
    • 访问控制系统入门
    • 创建用户
    • 授予权限
    • 撤销权限
    • 角色管理
    • 删除用户
    • 维护数据库表
    • 备份数据库
    • 列出数据库
    • 列出表
    • 列出表的列
    • 列出用户
Powered by GitBook
On this page
  • MySQL ENUM数据类型简介
  • 插入MySQL ENUM值
  • 过滤MySQL ENUM值
  • 排序MySQL ENUM值
  • MySQL ENUM的缺点

Was this helpful?

  1. 第一章 基础教程
  2. 第十三节 数据类型

13.13 ENUM

Previous13.12 JSONNext第十四节 约束

Last updated 5 years ago

Was this helpful?

在本教程中,您将学习如何使用MySQL ENUM数据类型定义存储枚举值的列。

MySQL ENUM数据类型简介

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

ENUM数据类型提供以下优点:

  • 紧凑型数据存储,MySQL ENUM使用数字索引(1,2,3,…)来表示字符串值。

  • 可读查询和输出。

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

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

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

下面来看看看下面的例子。

假设我们必须存储优先级为:low, medium 和 high 的票据信息。 要将priority列分配给ENUM类型,请使用以下语句:

USE testdb;

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

priority列只接受三个Low, Medium, High值。 在后台,MySQL将每个枚举成员映射到数字索引。在这种情况下,Low,Medium和High分别映射到1,2和3(注意:与数组不同,这不是从0开始的)。

插入MySQL ENUM值

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

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

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

在这个例子中,我们使用的值为:1,而不是使用Low枚举值,因为Low被映射到1,这是可以接受的。

我们再向ticketa表添加一些行数据:

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

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

参见下列语句声明:

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

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

请注意,如果ENUM列定义为可空列,则可以接受NULL值。

过滤MySQL ENUM值

以下语句查询获得所有高优先级机票:

SELECT 
    *
FROM
    tickets
WHERE
    priority = 'High';

执行上面查询语句,得到以下结果 -

+----+----------------------------------------------+----------+
| id | title                                        | priority |
+----+----------------------------------------------+----------+
|  1 | Scan virus for computer A                    | High     |
|  4 | Create a new user for the new employee David | High     |
+----+----------------------------------------------+----------+
2 rows in set

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

SELECT 
    *
FROM
    tickets
WHERE
    priority = 3;

也可以使用比较运算符来查询,比如 -

SELECT 
    *
FROM
    tickets
WHERE
    priority >= 2;

排序MySQL ENUM值

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

SELECT 
    title, priority
FROM
    tickets
ORDER BY priority DESC;

执行上面查询语句,得到以下结果 -

+----------------------------------------------+----------+
| title                                        | priority |
+----------------------------------------------+----------+
| Scan virus for computer A                    | High     |
| Create a new user for the new employee David | High     |
| Install Google Chrome for Mr. John           | Medium   |
| Upgrade Windows OS for all computers         | Low      |
| Refresh the computer of Ms. Lily             | Low      |
+----------------------------------------------+----------+
5 rows in set

在创建列时,按顺序定义枚举值是一个很好的做法。

MySQL ENUM的缺点

MySQL ENUM有以下缺点:

  • 获取完整的枚举列表很复杂,因为需要访问

    information_schema

    数据库:

    SELECT 
      column_type
    FROM
      information_schema.COLUMNS
    WHERE
      TABLE_NAME = 'tickets'
          AND COLUMN_NAME = 'priority';
  • 迁移到其他RDBMS可能是一个问题,因为ENUM不是SQL标准的,并且数据库系统不支持它。

  • 向枚举列表添加更多属性是不可能的。假设您要为每个优先级添加服务协议,例如High(24h),Medium(1-2天),Low(1周),则不可以使用ENUM类型的。 在这种情况下,需要有一个单独的表来存储优先级列表,例如priority(id,name,sort_order,description),并且通过引用了priority表的id字段的priority_id来替换tickets表中的priority字段。

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

要将数据到ENUM列中,可以使用预定义列表中的枚举值。 例如,以下语句在tickets表中插入一个新行。

MySQL根据索引号ENUM值。 因此,成员的顺序取决于它们在枚举列表中的定义。

更改枚举成员需要使用语句重建整个表,这在资源和时间方面是昂贵的。

与查找表(priorities)相比,枚举列表不可重用。 例如,如果要一个名为tasks并且要重用优先级列表的新表,则是不可能的。

CREATE TABLE
插入
排序
ALTER TABLE
创建