CREATE TYPE … AS ENUM în PostgreSQL

Tabele, scheme și tipuri (DDL) PostgreSQL 8.3+ (ALTER TYPE ... ADD VALUE: 9.1+, RENAME VALUE: 10+)

Creează un tip cu o listă fixă de valori permise, de exemplu stările unei comenzi: noua, platita, livrata.

Sintaxă SQL
CREATE TYPE nume AS ENUM ('valoare1', 'valoare2', ...);
ALTER TYPE nume ADD VALUE [IF NOT EXISTS] 'noua' [BEFORE | AFTER 'existenta'];
ALTER TYPE nume RENAME VALUE 'veche' TO 'noua';

Ce face CREATE TYPE ... AS ENUM

Un tip enum acceptă doar valorile din lista lui. Coloana status status_comanda nu poate primi o valoare scrisă greșit, iar valorile se ordonează după poziția din listă, nu alfabetic.

Poți adăuga valori noi cu ALTER TYPE ... ADD VALUE și le poți redenumi, dar nu le poți șterge. Dacă lista se schimbă des sau are nevoie de date suplimentare (o descriere, o culoare), un tabel separat cu cheie străină este mai flexibil.

Funcția enum_range(NULL::tip) returnează toate valorile, în ordine.

Parametri

Parametru Descriere
valorile Etichete text, sensibile la majuscule, max 63 de octeți fiecare.
ADD VALUE ... BEFORE / AFTER Adaugă o valoare într-o anumită poziție (implicit la final).
RENAME VALUE Redenumește o valoare existentă.

Ce returnează

Mesajul CREATE TYPE, respectiv ALTER TYPE.

Exemple

Exemplul 1: Starea unei comenzi

CREATE TYPE status_comanda AS ENUM ('noua', 'platita', 'livrata');

CREATE TABLE comenzi (
    id      integer GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
    status  status_comanda NOT NULL DEFAULT 'noua'
);
INSERT INTO comenzi (status) VALUES ('platita');
INSERT INTO comenzi (status) VALUES ('anulata');

Rezultat în psql

CREATE TYPE
CREATE TABLE
INSERT 0 1
ERROR:  invalid input value for enum status_comanda: "anulata"
LINE 1: INSERT INTO comenzi (status) VALUES ('anulata');
                                             ^

Exemplul 2: Adăugarea unei valori și ordinea

ALTER TYPE status_comanda ADD VALUE 'anulata' AFTER 'platita';

SELECT enum_range(NULL::status_comanda);
SELECT 'livrata'::status_comanda > 'noua'::status_comanda AS dupa;

Rezultat în psql

ALTER TYPE
           enum_range           
--------------------------------
 {noua,platita,anulata,livrata}
(1 row)

 dupa 
------
 t
(1 row)

Greșeli frecvente

  • Vrei să ștergi o valoare din enum: nu se poate direct. Trebuie creat un tip nou și convertită coloana.
  • Adaugi o valoare cu ADD VALUE și o folosești în aceeași tranzacție: primești unsafe use of new value. Valoarea nouă poate fi folosită după COMMIT.
  • Compari un enum cu text și te aștepți la ordine alfabetică. Ordinea este cea din definiția tipului.

Comenzi înrudite

  • CREATE DOMAIN: Creează un tip nou pe baza unui tip existent, cu reguli proprii (CHECK, NOT NULL), refolosibil în mai multe tabele.
  • CREATE TABLE: Creează un tabel nou, cu coloane, tipuri de date și constrângeri: PRIMARY KEY, NOT NULL, UNIQUE, CHECK, DEFAULT, FOREIGN KEY.
  • ALTER TABLE: Modifică un tabel existent: adaugă, șterge sau redenumește coloane, schimbă tipul, valoarea implicită și constrângerile.