Enumerated或ENUM数据类型用于从多个值的列表中选择一个值。特定值将从ENUM数据类型的下拉列表中选择。ENUM值是静态的,唯一的,并且区分大小写的。所以,用户必须从ENUM值中选择任何值。与任何ENUM值不匹配的输入值不能被插入ENUM字段。这种数据类型需要4个字节来存储在表中。ENUM数据类型对于存储那些将来不需要改变的数据类型很有用。它有助于只插入有效的数据。ENUM数据类型在PostgreSQL中的用途已在本教程中展示。
前提条件
在执行本教程中的SQL语句之前,你必须在Linux操作系统上安装最新版本的PostgreSQL包。运行下面的命令来安装和启动PostgreSQL。
$sudo apt-get \-y installpostgresql postgresql-contrib
$sudosystemctl start postgresql.service
运行下面的命令,以root权限登录到PostgreSQL。
$ sudo\-upostgres psql
ENUM数据类型的使用
在创建任何具有布尔数据类型的表之前,你必须先创建一个PostgreSQL数据库。因此,运行下面的命令来创建一个名为 "testdb"的数据库。
#CREATE DATABASEtestdb;
创建数据库后会出现以下输出。

创建并读取ENUM类型
运行下面的CREATE命令,创建一个名为account_status的ENUM类型,有三个值。
#CREATE TYPEaccount\_statusASenum('Pending', 'Inactive', 'Active');
运行下面的SELECT命令来打印之前已经创建的ENUM类型的值。
#SELECTUNNEST(enum\_range(NULL:: account\_status)) ASaccount\_status;
执行上述命令后会出现以下输出。

重新命名ENUM类型
运行下面的命令,将ENUM类型的名称从 'account_status'改为'status'。
#ALTER TYPEaccount\_statusRENAME TO STATUS;
使用ENUM数据类型创建一个表
在当前数据库中创建一个名为'account'的表,有三个字段。第一个字段名是用户名,是的主键。第二个字段名是姓名,数据类型是VARCHAR(30)。第三个字段名是地址,数据类型是TEXT。第四个字段名是email,数据类型是VARCHAR (50)。第五个字段名是 a_status,数据类型是之前创建的ENUM。
#CREATE TABLEaccount(
usernameVARCHAR (20) PRIMARY KEY,
nameVARCHAR (30),
address TEXT,
emailVARCHAR (50),
a\_statusSTATUS ) 。
执行上述命令后会出现以下输出。

向表中插入数据
运行下面的INSERT查询,向帐户表插入三条记录。ENUM字段的所有值在这里都有效。
#INSERT INTOaccount(username,name,address,email,a\_status)
VALUES
('farhad1278', 'Farhad Hossain', '123/7, Dhanmondi Dhaka.', 'farhad@gmail.com', 'Active'),
('nira8956', 'Nira Akter', '10/A, Jigatola Dhaka.', 'nira@gmail.com', 'Inactive'),
('jafar90',' Jafar Iqbal', '564, Mirpur Dhaka. ','jafar@gmail.com','Pending');
执行上述查询后会出现以下输出。

运行下面的INSERT查询,向帐户表插入一条记录,但是ENUM字段给出的值在ENUM类型中不存在。
#INSERT INTOaccount(username,name,address,email,a\_status)
VALUES
('rifad76', 'Rifad Hasan', '89, Gabtoli Dhaka. ', 'rifad@gmail.com', 'Blocked');
执行上述查询后会出现以下输出。输出中出现了错误,因为给出的ENUM值在ENUM类型中不存在。

运行下面的SELECT命令,从帐户表中读取所有记录。
#SELECT \* FROMaccount;
运行下面的SELECT命令,读取账户表中那些在ENUM字段中包含 "Active "或 "Pending "值的记录。
#SELECT \* FROMaccountWHEREa\_status='Active' ORa\_status='Pending';
执行上述SELECT查询后会出现以下输出。

改变ENUM的值
如果任何现有的ENUM类型的值被改变,那么使用该ENUM的表的ENUM字段值也将被改变。
运行下面的ALTER命令,将ENUM值 "Active "改为 "Online"。
#ALTER TYPE STATUS RENAME VALUE 'Active' TO 'Online';
运行下面的SELECT命令,检查改变ENUM值后帐户表的记录。
#SELECT \* FROMaccount;
执行上述命令后,将出现以下输出。表中有一条包含ENUM值的记录,'Active'。输出显示,在改变ENUM值后,'Active'值已被改为'Online'。

给现有的ENUM数据类型添加新的值
运行下面的ALTER命令,在名为status的ENUM类型中添加一个新项目。
#ALTER TYPE STATUS ADD VALUE 'Blocked';
运行下面的SELECT查询,在添加新值后,将打印出ENUM类型的列表。
#SELECTUNNEST(enum\_range(NULL::STATUS)) ASaccount\_status;
执行上述查询后会出现以下输出。

一个新的值可以在现有ENUM类型的特定值之前或之后插入。运行第一条ALTER命令, 在值 "Inactive "之前添加新的值, "Blocked"。运行第二条ALTER命令,在 "Inactive "值之后添加新的值,"Blocked"。
#ALTER TYPE STATUS ADD VALUE ' Blocked' BEFORE'Inactive';
#ALTER TYPE STATUS ADD VALUE ' Blocked'AFTER 'Inactive';
删除ENUM数据类型
在删除ENUM类型之前,你必须先删除使用ENUM类型的表。 运行下面的命令来删除该表。
#DROP TABLEaccount;
在删除表之后,运行下面的命令来删除ENUM类型。
#drop type status;
总结
本教程中展示了在PostgreSQL中创建、更新和删除ENUM数据类型的方法,以及ENUM数据类型在PostgreSQL表中的用途,这将有助于PostgreSQL新用户了解正确使用ENUM数据类型的目的。