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știunsafe 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.