跳到主要内容

枚举支持函数

PostgreSQL 枚举类型把一组固定标签定义为列类型。标签的声明顺序也是比较顺序,不按字符串字母顺序排序。以下示例先创建一个示例类型:

CREATE TYPE order_state AS ENUM ('new', 'paid', 'shipped');
SELECT 'new'::order_state < 'paid'::order_state; -- true

查询枚举范围​

SELECT enum_first(NULL::order_state); -- new
SELECT enum_last(NULL::order_state); -- shipped
SELECT enum_range(NULL::order_state); -- {new,paid,shipped}
SELECT enum_range('new'::order_state, 'paid'::order_state); -- {new,paid}

这些函数根据实参类型定位枚举;传入 NULL::order_state 时依然可以工作。两参数的 enum_range 包含两端,端点为 NULL 表示从起点或到终点;端点顺序相反时返回空数组。结果是枚举值数组,可用 unnest(enum_range(NULL::order_state)) 展开。

维护与边界​

可以 ALTER TYPE order_state ADD VALUE 'cancelled' 添加标签,并按需要指定 BEFORE/AFTER。枚举值不能随意删除,也不能直接改变既有值的顺序;改名有专门的 RENAME VALUE。枚举之间不能直接比较,即使标签文字相同也属于不同类型。枚举适合变化少、含义稳定的状态;若状态需要频繁增删、额外属性或外键关系,状态表可能更合适。上面的 CREATE TYPE 只需运行一次,重复运行会因名称已存在而报错。