MySQL ENUM
MySQL中的ENUM数据类型是
字符串对象。它允许我们在创建表时限制从列规范中的允许值列表中选择的值。
枚举的缩写,表示每一列可能具有指定的可能值之一。它使用
数字索引(1、2、3…)表示字符串值。
MySQL ENUM数据类型具有以下优点:
紧凑的数据存储,其中该列可能具有一组有限的指定可能值。此处,字符串值自动用作数字索引。
它允许可读的查询和输出,因为数字可以再次转换为相应的字符串。
它可以接受许多数据类型,例如整数,浮点数,十进制和字符串。
语法
以下是用于在列中定义ENUM数据类型的语法:
CREATE TABLE table_name (
Column1,
Column2 ENUM ('value_1','value_2','value_3'),
Column3…
);
在以上语法中,我们仅定义了三个ENUM值,但可以根据需要将其增加。在这里,我们必须确保枚举值应始终保持在
带引号的字符串文字之内。
MySQL允许我们使用以下属性定义ENUM数据类型:
不为空: 默认情况下,ENUM数据类型为NULL。如果我们不想允许NULL值,则在指定ENUM列时需要使用NOT NULL属性。
NULL: : 它是DEFAULT NULL的同义词,
默认值: : 如果在列中未指定值,则ENUM数据类型将插入默认值。换句话说,如果INSERT语句没有为该列提供值,则将插入默认值。 DEFAULT表达式不允许插入函数。 My SQL中的ENUM数据类型包括默认值NULL或空字符串('')。
MySQL ENUM示例
让我们了解ENUM数据类型的方式可以通过以下插图在MySQL中工作。在这里,我们将创建一个名为"
衬衫"的表,该表包含三列: id,名称和大小。
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;
下面的图像包含以上所有查询结果,这些查询结果仅包含字符串文字中的枚举值:
ENUM排序
MySQL根据其数值索引对枚举值进行排序,这些数值索引取决于我们在列规范中插入数据的顺序。
例如,如果我们已将枚举定义为ENUM("b"," a","''," c")。然后,b在a之前,空字符串在c(非空字符串)之前,而NULL值在其他值之前。
因此,如果我们不想使用ENUM数据类型获得意外结果,使用 ORDER BY子句,请遵循以下规则:
按字母顺序定义枚举值。
要确保列名按词法顺序而不是索引号。
以下示例更清楚地说明了枚举排序。因此,如果要按特定顺序获取衬衫的尺寸,请执行以下语句:
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、我们不能在枚举列表中添加更多属性。