MySQL中的枚举器(Enum)
ENUM 是一个字符串对象,其值由在列创建时明确定义的一组允许的字面量(值)决定。
枚举数据类型的好处 -
- 将数据存储在有限大小的列中需要简洁的数据存储。您传递给枚举数据类型的字符串隐式地获得数字编号。
- 它还可以轻松提供可读的查询和输出,因为数字可以转换回相应字符串的结果。
列的枚举语法:
CREATE TABLE table_name (
col...
col ENUM ('value_1','value_2','value_3', ....),
col...
);
MySQL 允许我们使用以下三个属性定义 ENUM 数据类型 -
- 非空 –
如果我们不想要 NULL 值,则需要在 ENUM 列中使用 NOT NULL 属性。 - 空值 -
它是 DEFAULT NULL 的同义词,其索引值始终为 NULL。 - 默认 -
默认情况下,ENUM 数据类型为 NULL,如果用户不想向它传递任何值。
例子 :
假设我们要将学生数据存储在Student_grade表中,以便将学生的成绩存储在相应的列(高、中、低)中。我们使用优先级语句为Enum列分配优先级。
CREATE TABLE Student_grade(
id INT PRIMARY KEY AUTO_INCREMENT, Grade VARCHAR(250) NOT NULL,
priority ENUM('Low', 'Medium', 'High') NOT NULL
);
优先列将只接受三列。这里,编号顺序为低->1、中->2、高->3。
插入数据到表中——
- 在名为Student_grade的表中插入新行,语句如下——
INSERT INTO Student_grade(Grade, priority)
VALUES('Good grades', 'High');
- 除了使用枚举值,您也可以使用数字索引,以便将值插入表的Enum列中 –
INSERT INTO Student_grade(Grade, priority)
VALUES('Poor grades', 1);
// Here we use 1 instead of using 'Low' enumeration value,
since 1 is mapped to 'Low' implicitly.
- 让我们在Student_grade 表中添加更多行——
INSERT INTO Student_grade(Grade, priority)
VALUES('Mediocre grade', 'Medium');
INSERT INTO Student_grade(Grade)
VALUES('Poor grades',1);
INSERT INTO Student_grade(Grade)
VALUES('Good grades','High');
注意:如果 ENUM 列被定义为可以为空的列,它也可以存储 NULL 值。
输出 :
- 以下声明带来了所有高年级学生的成绩——
SELECT * FROM Student_grade
WHERE priority = 'High';
- 您可以通过此 My SQL 查询获得相同的结果 –
SELECT * FROM Student_grade
WHERE priority = 3;
- 下面的查询选择 Student_grade 并按优先级从高到低对它们进行排序 -
SELECT Grade, priority FROM Student_grade
ORDER BY priority DESC;
MySQL ENUM 缺点:
- 如果您正在考虑修改枚举成员,那么您需要使用 ALTER TABLE 命令重建整个表,这在使用的资源和时间方面具有相当大的开销。
- 获取完整的枚举列表非常复杂,因为在这种情况下,您需要访问 inform_schema 数据库——
SELECT colmn_type FROM inform_schema
WHERE TABLE_NAME = 'Student_grade' AND COLUMN_NAME = 'priority';
- 将它移植到其他 RDBMS 可能是一项艰巨的任务,因为 ENUM 不是 SQL 的标准数据类型,而且没有多少数据库系统为其提供支持。
- 无法向枚举列插入更多值。假设您有兴趣为每个优先级(例如高(48 小时)、中(4-3 天)、低(1 周))插入基于服务的协议,但这并不像 ENUM 数据看起来那么简单和实用类型。
- 枚举列表不可重用。因为如果,你想创建一个名为“Emp-List”的新表并有兴趣重用它的优先级列表,所以这是不可能的。