📜  MySQL枚举

📅  最后修改于: 2020-11-19 02:05:13             🧑  作者: Mango

MySQL ENUM

MySQL中的ENUM数据类型是一个字符串对象。它允许我们在创建表时限制从列规范中的允许值列表中选择的值。它是枚举的缩写,这意味着每一列都可以具有指定的可能值之一。它使用数字索引(1、2、3…)表示字符串值。

MySQL ENUM数据类型包含以下优点:

  • 紧凑的数据存储,其中列可能具有一组有限的指定可能值。在此,字符串值自动用作数字索引。
  • 它允许可读的查询和输出,因为数字可以再次转换为相应的字符串。
  • 它可以接受许多数据类型,例如integer,浮点数,十进制和字符串。

句法

以下是用于在列中定义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。

默认值:如果在列中未指定值,则ENUM数据类型将插入默认值。换句话说,如果INSERT语句没有为该列提供值,则将插入默认值。 DEFAULT表达式不允许插入函数。 My SQL中的ENUM数据类型包括DEFAULT值,如NULL或空字符串('')。

MySQL ENUM示例

通过下图,让我们了解ENUM数据类型在MySQL中的工作方式。在这里,我们将创建一个名为“ shirts”的表,该表包含三列:id,name和size。

size列使用ENUM数据类型,并且具有小,中,大和x大尺寸。 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.我们不能在枚举列表中添加更多属性。