📅  最后修改于: 2020-11-19 02:05:13             🧑  作者: Mango
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数据类型:
NOT NULL:默认情况下,ENUM数据类型为NULL。如果我们不想允许NULL值,则在指定ENUM列时需要使用NOT NULL属性。
NULL:它是DEFAULT NULL的同义词,其索引值始终为NULL。
默认值:如果在列中未指定值,则ENUM数据类型将插入默认值。换句话说,如果INSERT语句没有为该列提供值,则将插入默认值。 DEFAULT表达式不允许插入函数。 My SQL中的ENUM数据类型包括DEFAULT值,如NULL或空字符串('')。
通过下图,让我们了解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;
该查询将给出以下输出,在该输出中我们可以看到衬衫的大小按降序排列:
以下是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.我们不能在枚举列表中添加更多属性。