枚举类型

PostgreSQL 9.4.4 中文手册
上一页 | 上一级 | 章 8. 数据类型 | 下一页

# 8.7. 枚举类型

枚举类型是一个包含静态和值的有序集合的数据类型。等于某些编程语言中的`enum` 类型。一个枚举类型可以是一周中的天，或者一块数据的状态值的集合。

## 8.7.1. 枚举类型的声明

用CREATE TYPE创建枚举类型，如：

    CREATE TYPE mood AS ENUM ('sad', 'ok', 'happy');

就像其他类型一样，一旦创建，枚举类型可以用于表和函数定义。

    CREATE TYPE mood AS ENUM ('sad', 'ok', 'happy');
    CREATE TABLE person (
        name text,
        current_mood mood
    );
    INSERT INTO person VALUES ('Moe', 'happy');
    SELECT * FROM person WHERE current_mood = 'happy';
     name | current_mood
    ------+--------------
     Moe  | happy
    (1 row)

## 8.7.2. 排序

枚举类型中，值的顺序是创建枚举类型时定义的顺序。 所有的比较标准运算符及其相关的聚合函数都可支持枚举类型，例如：

    INSERT INTO person VALUES ('Larry', 'sad');
    INSERT INTO person VALUES ('Curly', 'ok');
    SELECT * FROM person WHERE current_mood > 'sad';
     name  | current_mood
    -------+--------------
     Moe   | happy
     Curly | ok
    (2 rows)

    SELECT * FROM person WHERE current_mood > 'sad' ORDER BY current_mood;
     name  | current_mood
    -------+--------------
     Curly | ok
     Moe   | happy
    (2 rows)

    SELECT name
    FROM person
    WHERE current_mood = (SELECT MIN(current_mood) FROM person);
     name
    -------
     Larry
    (1 row)

## 8.7.3. 类型安全

每个枚举类型都是独立的，不能与其他枚举类型结合，如：

    CREATE TYPE happiness AS ENUM ('happy', 'very happy', 'ecstatic');
    CREATE TABLE holidays (
        num_weeks integer,
        happiness happiness
    );
    INSERT INTO holidays(num_weeks,happiness) VALUES (4, 'happy');
    INSERT INTO holidays(num_weeks,happiness) VALUES (6, 'very happy');
    INSERT INTO holidays(num_weeks,happiness) VALUES (8, 'ecstatic');
    INSERT INTO holidays(num_weeks,happiness) VALUES (2, 'sad');
    ERROR:  invalid input value for enum happiness: "sad"
    SELECT person.name, holidays.num_weeks FROM person, holidays
      WHERE person.current_mood = holidays.happiness;
    ERROR:  operator does not exist: mood = happiness

如果真的需要那么做，可以要么自定义运算符，要么为查询添加显式转换：

    SELECT person.name, holidays.num_weeks FROM person, holidays
      WHERE person.current_mood::text = holidays.happiness::text;
     name | num_weeks
    ------+-----------
     Moe  |         4
    (1 row)

## 8.7.4. 实施细则

一个枚举值在磁盘上占4字节。一个枚举值的文本标签长度由编译到PostgreSQL 中的`NAMEDATALEN`设置，以标准方式编译意味着最多63字节。

枚举标签对大小写是敏感的，因此`'happy'`不等于`'HAPPY'`。 标签中的空格也是一样。

从内部枚举值到文本标签的翻译是保存在系统目录 `pg_enum`中。 可以直接查询这个目录。

上一页 | 起始页 | 下一页
布尔类型 | 上一级 | 几何类型