CREATE DOMAIN în PostgreSQL

Creează un tip nou pe baza unui tip existent, cu reguli proprii (CHECK, NOT NULL), refolosibil în mai multe tabele.

Sintaxă SQL
CREATE DOMAIN nume AS tip_de_baza
    [DEFAULT valoare]
    [NOT NULL]
    [CONSTRAINT nume CHECK (condiție cu VALUE)];

Ce face CREATE DOMAIN

Un domeniu este un tip „cu reguli”: cod_postal este text, dar doar de 6 cifre. Regula se scrie o singură dată și se aplică în toate coloanele care folosesc domeniul, în parametrii funcțiilor și la conversii.

În condiția CHECK, valoarea verificată se numește VALUE. Dacă nu dai un nume constrângerii, PostgreSQL o numește <domeniu>_check.

Regulile se pot schimba ulterior cu ALTER DOMAIN ... ADD CONSTRAINT (cu verificarea datelor existente) sau DROP CONSTRAINT.

Parametri

Parametru Descriere
AS tip_de_baza Tipul existent: text, numeric, integer etc.
CHECK (... VALUE ...) Condiția pe care trebuie s-o respecte fiecare valoare.
NOT NULL Interzice NULL (în practică, e mai sigur să pui NOT NULL pe coloană).
DEFAULT Valoarea implicită pentru coloanele de acest tip.

Ce returnează

Mesajul CREATE DOMAIN.

Exemple

Exemplul 1: Cod poștal românesc și sumă pozitivă

CREATE DOMAIN cod_postal AS text CHECK (VALUE ~ '^\d{6}$');
CREATE DOMAIN suma_lei AS numeric(12, 2) CHECK (VALUE >= 0);

CREATE TABLE adrese (
    id     integer GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
    oras   text NOT NULL,
    cod    cod_postal NOT NULL
);
INSERT INTO adrese (oras, cod) VALUES ('Iași', '700259');
INSERT INTO adrese (oras, cod) VALUES ('Cluj', '4000');

Rezultat în psql

CREATE DOMAIN
CREATE DOMAIN
CREATE TABLE
INSERT 0 1
ERROR:  value for domain cod_postal violates check constraint "cod_postal_check"

Exemplul 2: Domeniu folosit într-o funcție

SELECT '149.90'::suma_lei AS ok;
SELECT '-5'::suma_lei;

Rezultat în psql

   ok   
--------
 149.90
(1 row)

ERROR:  value for domain suma_lei violates check constraint "suma_lei_check"

Greșeli frecvente

  • Scrii numele coloanei în CHECK-ul domeniului. În domeniu se folosește întotdeauna VALUE.
  • Folosești un domeniu pentru o listă de stări care se va schimba: pentru valori fixe, un ENUM sau un tabel de referință sunt mai clare.

Comenzi înrudite

  • CREATE TYPE ... AS ENUM: Creează un tip cu o listă fixă de valori permise, de exemplu stările unei comenzi: noua, platita, livrata.
  • 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.