数据库

Postgres 中的枚举管理


Postgres 中的枚举(Enum)是一种自定义数据类型。它允许您定义一组列可以持有的值(或标签)。当列的可能值集合固定时,枚举非常有用。

创建枚举

您可以使用 create type 语句定义 Postgres 枚举。以下是一个示例:

1
2
3
4
5
6
create type mood as enum ( 'happy', 'sad', 'excited', 'calm');

在这个示例中,我们创建了一个名为 "mood" 的枚举,它有四个可能的值。

何时使用枚举

枚举和外键有很多重叠之处。两者都可以用于定义列的值集合。然而,使用枚举有一些优势:

  • 性能:您可以查询单个表,而不需要从查找表中获取值
  • 简洁性:通常 SQL 更易于阅读和编写

使用枚举也有一些缺点:

  • 灵活性有限:添加和删除值需要修改数据库模式(即使用迁移),而不是向表中添加数据
  • 维护开销:枚举类型需要持续维护。如果您的应用需求频繁变化,维护枚举可能会变得繁重

一般来说,只有当值列表较小、固定且不太可能经常变化时,才应该使用枚举。例如"大洲列表"或"部门列表"就是很好的枚举候选。

在表中使用枚举

要在表中使用枚举,您可以定义一个具有枚举类型的列。例如:

1
2
3
4
5
create table person ( id serial primary key, name text, current_mood mood);

这里,current_mood 列只能有 "mood" 枚举中的值。

插入枚举数据

您可以通过指定枚举值之一来向具有枚举列的表中插入数据:

1
2
3
4
insert into person (name, current_mood)values ('Alice', 'happy');

使用枚举查询数据

在查询数据时,您可以像往常一样对枚举值进行过滤和比较:

1
2
3
select * from person where current_mood = 'sad';

管理枚举

您可以使用 alter type 语句来管理枚举类型。以下是一些示例:

更新枚举值

您可以更新枚举列的值:

1
2
3
update personset current_mood = 'excited'where name = 'Alice';

添加枚举值

要向现有的Postgres枚举添加新值,可以使用 ALTER TYPE 语句。具体操作如下:

假设您有一个名为 mood 的现有枚举,想要添加一个新值 content

1
alter type mood add value 'content';

删除枚举值

虽然技术上可行,但一旦创建后删除枚举值是不安全的操作。最好保留原有的枚举值。

获取枚举值列表

通过查询 enum_range 函数来检查现有的枚举值:

1
select enum_range(null::mood);

相关资源