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
CREATE TABLE nome_tabella (
colonna TIPO [vincoli_colonna],
…,
[vincoli_tabella]
);Exemplu: o listă de dorințe care leagă clienți și produse:
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
| Tip | Ce deține |
|---|---|
INTEGER / INT | Numere întregi (-2,1B … +2,1B) |
BIGINT | numere întregi mari |
NUMERIC(p, s) | zecimale exacte — bani, procente |
TEXT | Șiruri de lungime variabilă |
VARCHAR(n) | Șiruri cu o lungime maximă de n |
BOOLEAN | TRUE / FALSE / NULL |
DATE | Numai data |
TIMESTAMP | Data + ora (fără fus orar) |
TIMESTAMPTZ | Data + ora cu fusul orar |
SERIAL | INTEGER 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ă.
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 fornitoConstrângerile pot fi declarate inline pe o coloană sau ca la nivel de tabel
constrângeri (sub câmpuri). Exemplu de UNIQUE compus:
UNIQUE (customer_id, product_id) -- niente coppia (cliente, prodotto) duplicataVERIFICARE constrângere
CHECK impune o regulă personalizată:
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
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
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).
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
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.
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