PostgreSQL 枚舉類型

2021-08-26 16:48 更新
8.7.1. 枚舉類型的聲明
8.7.2. 排序
8.7.3. 類型安全性
8.7.4. 實(shí)現(xiàn)細(xì)節(jié)

枚舉(enum)類型是由一個靜態(tài)、值的有序集合構(gòu)成的數(shù)據(jù)類型。它們等效于很多編程語言所支持的enum類型。枚舉類型的一個例子可以是一周中的日期,或者一個數(shù)據(jù)的狀態(tài)值集合。

8.7.1. 枚舉類型的聲明

枚舉類型可以使用CREATE TYPE命令創(chuàng)建,例如:

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

一旦被創(chuàng)建,枚舉類型可以像很多其他類型一樣在表和函數(shù)定義中使用:

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. 排序

一個枚舉類型的值的排序是該類型被創(chuàng)建時所列出的值的順序。枚舉類型的所有標(biāo)準(zhǔn)的比較操作符以及相關(guān)聚集函數(shù)都被支持。例如:

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. 類型安全性

每一種枚舉數(shù)據(jù)類型都是獨(dú)立的并且不能和其他枚舉類型相比較??催@樣一個例子:

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

如果你確實(shí)需要做這樣的事情,你可以寫一個自定義的操作符或者在查詢中加上顯式造型:

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. 實(shí)現(xiàn)細(xì)節(jié)

枚舉標(biāo)簽是大小寫敏感的,因此'happy''HAPPY'是不同的。標(biāo)簽中的空格也是有意義的。

盡管枚舉類型的主要目的是用于值的靜態(tài)集合,但也有方法在現(xiàn)有枚舉類型中增加新值和重命名值(見ALTER TYPE)。不能從枚舉類型中去除現(xiàn)有的值,也不能更改這些值的排序順序,如果要那樣做可以刪除并且重建枚舉類型。

一個枚舉值在磁盤上占據(jù)4個字節(jié)。一個枚舉值的文本標(biāo)簽的長度受限于NAMEDATALEN設(shè)置,該設(shè)置被編譯在PostgreSQL中,在標(biāo)準(zhǔn)編譯下它表示最多63字節(jié)。

從內(nèi)部枚舉值到文本標(biāo)簽的翻譯被保存在系統(tǒng)目錄pg_enum中??梢灾苯硬樵冊撃夸?。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號