MySQL enum类型 您所在的位置:网站首页 mysql创建一个表语法格式怎么弄 MySQL enum类型

MySQL enum类型

2024-07-06 08:01| 来源: 网络整理| 查看: 265

在本教程中,您将学习如何使用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类型,请使用以下CREATE TABLE语句:

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值

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

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值

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有以下缺点:

更改枚举成员需要使用ALTER TABLE语句重建整个表,这在资源和时间方面是昂贵的。获取完整的枚举列表很复杂,因为需要访问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字段。与查找表(priorities)相比,枚举列表不可重用。 例如,如果要创建一个名为tasks并且要重用优先级列表的新表,则是不可能的。

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

上一篇: MySQL数据类型 下一篇: MySQL技巧


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有