13.13 ENUM
在本教程中,您将学习如何使用MySQL ENUM
数据类型定义存储枚举值的列。
MySQL ENUM数据类型简介
在MySQL中,ENUM
是一个字符串对象,其值是从列创建时定义的允许值列表中选择的。
ENUM
数据类型提供以下优点:
紧凑型数据存储,MySQL
ENUM
使用数字索引(1,2,3,…)来表示字符串值。可读查询和输出。
要定义ENUM
列,请使用以下语法:
在这种语法中,可以有三个以上的枚举值。但是,将枚举值的数量保持在20
以下是一个很好的做法。
下面来看看看下面的例子。
假设我们必须存储优先级为:low
, medium
和 high
的票据信息。 要将priority
列分配给ENUM
类型,请使用以下CREATE TABLE语句:
priority
列只接受三个Low
, Medium
, High
值。 在后台,MySQL将每个枚举成员映射到数字索引。在这种情况下,Low
,Medium
和High
分别映射到1
,2
和3
(注意:与数组不同,这不是从0
开始的)。
插入MySQL ENUM值
要将数据插入到ENUM
列中,可以使用预定义列表中的枚举值。 例如,以下语句在tickets
表中插入一个新行。
除了枚举值之外,还可以使用枚举成员的数字索引将数据插入ENUM
列。 例如,以下语句插入优先级为Low
的新机票数据:
在这个例子中,我们使用的值为:1
,而不是使用Low
枚举值,因为Low
被映射到1
,这是可以接受的。
我们再向ticketa
表添加一些行数据:
因为我们将优先级定义为NOT NULL
列,当插入新行而不指定优先级列的值时,MySQL将使用第一个枚举成员作为默认值。
参见下列语句声明:
在非严格的SQL模式下,如果在ENUM
列中插入无效值,MySQL将使用空字符串''
,插入数字索引为0
。 如果启用了严格的SQL模式,尝试插入无效的ENUM
值将导致错误。
请注意,如果
ENUM
列定义为可空列,则可以接受NULL
值。
过滤MySQL ENUM值
以下语句查询获得所有高优先级机票:
执行上面查询语句,得到以下结果 -
由于枚举成员’High
‘映射到3
,因此以下查询返回相同的结果集:
也可以使用比较运算符来查询,比如 -
排序MySQL ENUM值
MySQL根据索引号排序ENUM
值。 因此,成员的顺序取决于它们在枚举列表中的定义。
以下查询选择门票并按优先级从高到低进行排序:
执行上面查询语句,得到以下结果 -
在创建列时,按顺序定义枚举值是一个很好的做法。
MySQL ENUM的缺点
MySQL ENUM
有以下缺点:
更改枚举成员需要使用ALTER TABLE语句重建整个表,这在资源和时间方面是昂贵的。
获取完整的枚举列表很复杂,因为需要访问
数据库:
迁移到其他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
数据类型以及如何使用它来定义存储枚举值的列。
Last updated