Mysql 简明教程
MySQL - ENUM
ENUM (枚举) 是一个用户定义的数据类型, 它将值列表存储为字符串。在定义 ENUM 列时指定这些值。用户可以在插入值到此列时从此预定义列表中选择值。
在 ENUM 列中定义的每个字符串值隐式分配一个从 1 开始的数值。MySQL 在内部使用这些数值来表示 ENUM 值。
The MySQL ENUM Data Type
MySQL ENUM 数据类型允许你在插入或更新操作期间从预定义列表中选择一个或多个值。选定的值以字符串的形式存储在表中, 当你从 ENUM 列中检索数据时, 这些值会以人类可读的格式显示。
Attributes of ENUM
MySQL 中的 ENUM 数据类型有三个属性。如下所述 −
-
Default − 枚举数据类型的默认值为 NULL。如果在插入时没有为枚举字段提供值,则会插入 Null 值。
-
NULL − 如果为枚举字段设置此属性,则其作用与 DEFAULT 值相同。如果已设置,则索引值始终为 NULL。
-
NOT NULL − 如果为枚举字段设置此属性,并且在插入时未提供值,则 MySQL 会生成警告消息。
Example
首先,让我们创建一个名为 STUDENTS 的表。在此表中,我们使用以下查询在 BRANCH 列中指定 ENUM 字符串对象 −
CREATE TABLE STUDENTS (
ID int NOT NULL AUTO_INCREMENT,
NAME varchar(30) NOT NULL,
BRANCH ENUM ('CSE', 'ECE', 'MECH'),
FEES int NOT NULL,
PRIMARY KEY (ID)
);
以下是所获得的输出 −
Query OK, 0 rows affected (0.04 sec)
现在,我们检索 STUDENTS 表的结构,显示“BRANCH”字段具有枚举数据类型 −
DESCRIBE STUDENTS;
输出显示 BRANCH 字段的数据类型为 ENUM,用于存储值 ('CSE', 'ECE', 'MECH') −
现在,让我们使用以下 INSERT 查询向 STUDENTS 表中插入记录 −
INSERT INTO STUDENTS (NAME, BRANCH, FEES) VALUES
('Anirudh', 'CSE', 500000),
('Yuvan', 'ECE', 350000),
('Harris', 'MECH', 400000);
在这些插入查询中,我们已对“BRANCH”字段使用了值 ('CSE', 'ECE' 和 'MECH'),这些是有效的枚举值。因此,查询在未出现任何错误的情况下执行 −
Query OK, 3 rows affected (0.01 sec)
Records: 3 Duplicates: 0 Warnings: 0
使用以下查询,我们可以显示表中的所有值 −
SELECT * FROM STUDENTS;
以下是 STUDENTS 表的记录 −
Inserting Records with Numerical ENUM Values
我们可以使用相应的数字索引将枚举列表值插入表中的 ENUM 列。数字索引从 1 开始,而不是从 0 开始。
Inserting Invalid Records
在 MySQL 中,如果我们尝试将不匹配任何指定枚举值的值插入到具有 ENUM 数据类型的列中,则会导致错误。
Filtering Records by Numeric ENUM Value
在 MySQL 中,您可以根据字符串值或数字索引从 ENUM 列中检索记录。数字索引从 1 开始,而不是从 0 开始。
Filtering Records by Human-Readable ENUM Value
在某些情况下,枚举列表将具有大量的值。记住列表中每个值数字索引可能很困难。在这种情况下,在查询中使用 ENUM 项可读字符串值来根据 ENUM 字段值检索记录更加方便。
Disadvantages of ENUM Data Type
以下是 MySQL 中 ENUM 数据类型有以下缺点:
-
如果我们希望修改枚举列表中的值,则需要使用 ALTER TABLE 命令重新创建整个表,这在使用资源和时间方面相当昂贵。
-
非常复杂才能获得完整的枚举列表,因为我们需要访问 inform_schema 数据库。
-
不能使用枚举值和表达式。例如,下面的 CREATE 语句将返回一个错误,因为它使用 CONCAT() 函数创建枚举值:
CREATE TABLE Students (
ID int PRIMARY KEY AUTO_INCREMENT,
NAME varchar(30),
BRANCH ENUM('CSE', CONCAT('ME','CH'))
);
用户变量不能用于枚举值。例如,请看以下查询:
mysql> SET @mybranch = 'EEE';
mysql> CREATE TABLE Students (
ID int PRIMARY KEY AUTO_INCREMENT,
NAME varchar(30),
BRANCH ENUM('CSE', 'MECH', @mybranch)
);
建议不要将数字值用作枚举值。