枚举类型
枚举(enum)类型是由一个静态、值的有序集合构成的数据类型。枚举类型的一个例子可以是一周中的日期,或者一个数据的状态值集合。枚举类型可以使用 CREATE TYPE
命令创建。
例如创建并应用一个枚举类型:
highgo=# CREATE TYPE mood AS ENUM ('sad', 'ok', 'happy'); CREATE TYPE
highgo=# CREATE TABLE person ( name text, current_mood mood ); CREATE TABLE
highgo=# INSERT INTO person VALUES ('Moe', 'happy'); INSERT 0 1 highgo=# SELECT* FROM person WHERE current_mood='happy'; name | current_mood
Moe | happy (1 行记录)
|
在排序的时候,一个枚举类型的值的排序是该类型被创建时所列出的值的顺序,比如上面创建的 mood 类型的排序为 sad、ok、happy。
尽管枚举类型的主要目的是用于值的静态集合,但也有方法在现有枚举类型中增加新值和重命名值。不可以从枚举类型中去除现有的值,也不能更改这些值的排序顺序,如果要那样做可以删除并且重建枚举类型。
例如创建并应用新的枚举类型 happiness:
highgo=# CREATE TYPE happiness AS ENUM ('happy', 'very happy', 'ecstatic'); CREATE TYPE
highgo=# CREATE TABLE holidays ( highgo(# num_weeks integer, highgo(# happiness happiness highgo(# ); CREATE TABLE highgo=# INSERT INTO holidays VALUES (4,'happy'),(6,'very happy'),(8,'ecstatic'); INSERT 0 3 highgo=# INSERT INTO holidays VALUES (2,'sad'); 错误: 对于枚举happiness的输入值无效: "sad"
highgo=# SELECT person.name,holidays.num_weeks FROM person,holidays WHERE person.current_mood = holidays.happiness; 错误: 操作符不存在: mood = happiness
|
每一种枚举数据类型都是独立的并且不能和其他枚举类型相比较。不同的枚举类型中即便存在相同的类型,它们之间也不能进行比较。如果你确实需要做这样的事情,可以写一个自定义的操作符或者在查询中加上显式造型:
highgo=# SELECT person.name,holidays.num_weeks,person.current_mood,holidays.happiness FROM person,holidays WHERE person.current_mood::text = holidays.happiness::text; name | num_weeks | current_mood | happiness
Moe | 4 | happy | happy (1 行记录)
|