Salt la conținutul principal
Modulul 8 · Lecția 3 din 431/57 în curs~12 min
Lecții din modul (3/4)

Crearea de tabele și constrângeri: DDL

Până acum ați lucrat la tabele care există deja (customers, orders…). DDL ("Data Definition Language") se referă la afirmațiile care creați și modificați schema în sine: tabele, coloane, constrângeri, indici.

CREATE TABLE: sintaxa

SQL
CREATE TABLE nome_tabella (
  colonna  TIPO  [vincoli_colonna],
  …,
  [vincoli_tabella]
);

Exemplu: o listă de dorințe care leagă clienți și produse:

SQL
CREATE TABLE wishlists (
  id           SERIAL PRIMARY KEY,
  customer_id  INTEGER NOT NULL REFERENCES customers(id),
  product_id   INTEGER NOT NULL REFERENCES products(id),
  added_on     DATE NOT NULL DEFAULT CURRENT_DATE,
  note         TEXT,
  UNIQUE (customer_id, product_id)
);

Să o descompunem bucată cu bucată.

Cele mai comune tipuri

TipCe deține
INTEGER / INTNumere întregi (-2,1B … +2,1B)
BIGINTnumere întregi mari
NUMERIC(p, s)zecimale exacte — bani, procente
TEXTȘiruri de lungime variabilă
VARCHAR(n)Șiruri cu o lungime maximă de n
BOOLEANTRUE / FALSE / NULL
DATENumai data
TIMESTAMPData + ora (fără fus orar)
TIMESTAMPTZData + ora cu fusul orar
SERIALINTEGER cu secvență de incrementare automată

Constrângeri

O constrângere este o regulă pe care PostgreSQL o aplică automat: dacă an INSERT/UPDATE îl încalcă, operațiunea eșuează.

SQL
PRIMARY KEY                         -- identifica univocamente la riga, non NULL
NOT NULL                            -- vieta NULL
UNIQUE                              -- vieta duplicati su questa colonna
REFERENCES tabella(colonna)         -- foreign key
CHECK (espressione_booleana)        -- es. CHECK (price > 0)
DEFAULT espressione                 -- valore di default se non fornito

Constrângerile pot fi declarate inline pe o coloană sau ca la nivel de tabel constrângeri (sub câmpuri). Exemplu de UNIQUE compus:

SQL
UNIQUE (customer_id, product_id)   -- niente coppia (cliente, prodotto) duplicata

VERIFICARE constrângere

CHECK impune o regulă personalizată:

SQL
CREATE TABLE stock_alerts (
  product_id   INTEGER PRIMARY KEY REFERENCES products(id),
  threshold    INTEGER NOT NULL CHECK (threshold >= 0),
  notify_email TEXT    NOT NULL,
  active       BOOLEAN NOT NULL DEFAULT true
);

threshold trebuie să fie ≥ 0; dacă cineva încearcă INSERT … threshold = -5, asta eșuează cu o eroare de constrângere.

Scăpare și modificare

SQL
DROP TABLE wishlists;                                 -- elimina la tabella (e i dati!)
DROP TABLE IF EXISTS wishlists;                       -- senza errore se non esiste
ALTER TABLE customers ADD COLUMN newsletter BOOLEAN NOT NULL DEFAULT false;
ALTER TABLE customers DROP COLUMN newsletter;

Rândul tău

Exercițiu#sql.m8.l3.e1
Încercări: 0Se încarcă…

Creați un tabel cu liste de dorințe cu următoarele coloane: id (CHEIE PRIMARĂ DE SERIE), id-client (INTERGER NU NULL REFERENȚE clienții(id)), product_id (INTEGER NOT NULL REFERENCES products(id)), added_on (DATA NU NULL cu DEFAULT CURRENT_DATE). Adăugați o constrângere UNIQUE pe pereche (customer_id, product_id).

Se încarcă editorul...
Afișează indiciu

UNIQUE (customer_id, product_id) ca o constrângere la nivel de tabel în partea de jos.

Soluție disponibilă după 3 încercări

Exercițiu de revizuire

Exercițiu#sql.m8.l3.e2
Încercări: 0Se încarcă…

Adăugați la tabelul clienți o coloană de newsletter de tip BOOLEAN, NOT NULL, cu DEFAULT false. Utilizați o singură instrucțiune ALTER TABLE.

Se încarcă editorul...
Afișează indiciu

Fără DEFAULT, ALTER ar eșua deoarece rândurile există deja și noua coloană NU este NULL.

Soluție disponibilă după 3 încercări