Postgres 中的枚举管理
Postgres 中的枚举(Enum)是一种自定义数据类型。它允许您定义一组列可以持有的值(或标签)。当列的可能值集合固定时,枚举非常有用。
创建枚举
您可以使用 create type
语句定义 Postgres 枚举。以下是一个示例:
123456create type mood as enum ( 'happy', 'sad', 'excited', 'calm');
在这个示例中,我们创建了一个名为 "mood" 的枚举,它有四个可能的值。
何时使用枚举
枚举和外键有很多重叠之处。两者都可以用于定义列的值集合。然而,使用枚举有一些优势:
- 性能:您可以查询单个表,而不需要从查找表中获取值
- 简洁性:通常 SQL 更易于阅读和编写
使用枚举也有一些缺点:
- 灵活性有限:添加和删除值需要修改数据库模式(即使用迁移),而不是向表中添加数据
- 维护开销:枚举类型需要持续维护。如果您的应用需求频繁变化,维护枚举可能会变得繁重
一般来说,只有当值列表较小、固定且不太可能经常变化时,才应该使用枚举。例如"大洲列表"或"部门列表"就是很好的枚举候选。
在表中使用枚举
要在表中使用枚举,您可以定义一个具有枚举类型的列。例如:
12345create table person ( id serial primary key, name text, current_mood mood);
这里,current_mood
列只能有 "mood" 枚举中的值。
插入枚举数据
您可以通过指定枚举值之一来向具有枚举列的表中插入数据:
1234insert into person (name, current_mood)values ('Alice', 'happy');
使用枚举查询数据
在查询数据时,您可以像往常一样对枚举值进行过滤和比较:
123select * from person where current_mood = 'sad';
管理枚举
您可以使用 alter type
语句来管理枚举类型。以下是一些示例:
更新枚举值
您可以更新枚举列的值:
123update personset current_mood = 'excited'where name = 'Alice';
添加枚举值
要向现有的Postgres枚举添加新值,可以使用 ALTER TYPE
语句。具体操作如下:
假设您有一个名为 mood
的现有枚举,想要添加一个新值 content
:
1alter type mood add value 'content';
删除枚举值
虽然技术上可行,但一旦创建后删除枚举值是不安全的操作。最好保留原有的枚举值。
请阅读Postgres邮件列表获取更多信息:
Postgres中没有 ALTER TYPE DELETE VALUE
功能。即使您删除了表中所有出现的枚举值(并通过vacuum清理了这些行),目标值仍可能存在于上层索引页中。如果删除 pg_enum
条目,将会破坏索引。
获取枚举值列表
通过查询 enum_range 函数来检查现有的枚举值:
1select enum_range(null::mood);
相关资源
- 官方Postgres文档:枚举类型