📜  MySQL中的枚举器(Enum)

📅  最后修改于: 2022-05-13 01:55:20.866000             🧑  作者: Mango

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”的新表并有兴趣重用它的优先级列表,所以这是不可能的。