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 întotdeaunaVALUE. - Folosești un domeniu pentru o listă de stări care se va schimba: pentru valori fixe, un
ENUMsau 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.