MySQL ENUM枚举类型
MySQL 中的 ENUM 数据类型是字符串对象。它允许我们在创建表时限制从列规范中的允许值列表中选择的值。它是enumeration的缩写,这意味着每一列可能具有指定的可能值之一。它使用数字索引(1、2、3…)来表示字符串值。
MySQLENUM 数据类型包含以下优点:
- 列可能具有一组有限的指定可能值的紧凑数据存储。在这里,字符串值自动用作数字索引。
- 它允许可读的查询和输出,因为数字可以再次转换为相应的字符串。
- 它可以接受许多数据类型,如整数、浮点、小数和字符串。
一、 MySQL ENUM枚举类型 语法
以下是用于在列中定义 ENUM 数据类型的语法:
CREATE TABLE table_name (
Column1,
Column2 ENUM ('value_1','value_2','value_3'),
Column3…
);
在上面的语法中,我们只定义了三个 ENUM 值,但可以根据需要增加。在这里,我们必须确保枚举值应始终保持在带引号的字符串字面量内。
MySQL 允许我们使用以下属性定义 ENUM 数据类型:
NOT NULL:默认情况下,ENUM 数据类型为 NULL。如果我们不想允许 NULL 值,则需要在指定 ENUM 列时使用 NOT NULL 属性。
NULL:是DEFAULT NULL的同义词,其索引值始终为NULL。
DEFAULT:当列中未指定值时,ENUM 数据类型插入默认值。换句话说,如果 INSERT 语句没有为该列提供值,则将插入默认值。DEFAULT 表达式不允许插入函数。My SQL 中的 ENUM 数据类型包括作为 NULL 或空字符串 ('') 的 DEFAULT 值。
二、MySQL ENUM枚举类型 示例
让我们通过下图了解 ENUM 数据类型在 MySQL 中是如何工作的。在这里,我们将创建一个名为“ shirts ”的表,其中包含三列:id、name 和 size。
size 列使用 ENUM 数据类型,具有 small、medium、large 和 x-large 大小。MySQL 将这些枚举成员映射到一个数字索引,其中 small=1、medium=2、large=3 和 x-large=4 分别。执行以下查询以创建表:
CREATE TABLE shirts (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(35),
size ENUM('small', 'medium', 'large', 'x-large')
);
接下来,我们需要将值插入到表中。在插入期间,枚举值可以作为字符串文字或其数字索引插入,并且两者都是相同的。执行以下语句将值插入表中:
INSERT INTO shirts(id, name, size)
VALUES (1,'t-shirt', 'medium'),
(2, 'casual-shirt', 3),
(3, 'formal-shirt', 4),
(4, 'polo-shirt', 'small');
现在,执行SELECT 语句,查看插入到表中的值:
mysql> SELECT * FROM shirts;
下图包含上述所有查询结果,其中仅包含字符串文字中的枚举值:
三、枚举排序
MySQL 根据它们的数字索引对枚举值进行排序,这些索引取决于我们在列规范中插入数据的顺序。例如,如果我们将枚举定义为 ENUM ('b', 'a', '', 'c')。然后,b 在 a 之前,空字符串在 c 之前(非空字符串),NULL 值在其他值之前。
因此,如果我们不想使用ORDER BY 子句获得 ENUM 数据类型的意外结果,请遵循以下规则:
- 按字母顺序定义枚举值。
- 这是为了确保列名是词法顺序而不是索引号。
以下示例更清楚地解释了枚举排序。因此,如果您想按特定顺序获取衬衫的尺寸,请执行以下语句:
mysql> SELECT * FROM shirts ORDER BY size DESC;
这个查询将给出如下输出,我们可以看到衬衫的尺寸是按降序排列的:
四、ENUM 数据类型的限制
以下是 MySQL 中 ENUM 数据类型的缺点:
1.如果我们想修改枚举值/成员,可以通过使用ALTER TABLE命令重建整个表来完成。它还昂贵地使用了我们的资源和时间。
2. 我们不能使用带有枚举成员的表达式。例如,此 CREATE 语句不会执行,因为它使用 CONCAT() 函数来创建枚举成员。
CREATE TABLE shirts (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(35),
size ENUM('small', CONCAT('med','ium'), 'large', 'x-large')
);
3.我们不能使用用户变量作为枚举成员。可以在下面的示例中看到:
SET @mysize = 'large';
CREATE TABLE shirts (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(35),
size ENUM('small', 'medium', @mysize, 'x-large')
);
4. 建议不要使用数值作为枚举成员。
5、获取完整的信息枚举列表比较复杂,因为我们需要访问information_schema数据库。
6. 我们在将ENUM移植到其他RDBMS时可能会遇到一个问题,因为很多数据库不支持这种数据类型。
7. 我们无法向枚举列表添加更多属性。
热门文章
优秀文章