PostgreSQL的枚举数据类型介绍及实例

1,968 阅读4分钟

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数据类型的目的。