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. 我们无法向枚举列表添加更多属性。

热门文章

优秀文章