====== Vincoli di controllo, integrita' referenziale di Postgresql ======
Autore: **//Fabio Di Matteo//** \\ Ultima revisione: **//27/10/2017 - 14:46//** \\ \\
===== Vincolo di controllo =====
Supponiamo volessimo evitare categoricamente all'utente di inserire un certo valore in una data colonna. Per esempio una colonna "voto" potrebbe essere vincolata al criterio voto>0. In questo caso sarebbe impossibile per l'utente inserire un voto pari a 0 oppure inferiore. \\
Creare una tabella con un campo vincolato al controllo:
CREATE TABLE persone(
id SERIAL PRIMARY KEY,
nome VARCHAR (50) ,
cognome VARCHAR (50) ,
email VARCHAR (355),
voto numeric CHECK (voto > 0)
);
Di seguito la query che modificha una tabella esistente aggiungendo un vincolo di controllo :
ALTER TABLE persone ADD constraint voto check(voto>0);
Per rimuovere il vincolo di controllo "voto" invece:
ALTER TABLE persone DROP constraint voto ;
===== Aggiungere integrita' referenziale tra due colonne di tabelle diverse =====
Alle volte è necessario fare in modo che una certa colonna sia viancolata ad un'altra di un'altra tabella. Il comportamento che ci aspettiamo è che sia impossibile inserire un valore diverso tra i due campi, e che inoltre all'eliminazione di un record della tabella collegata "persone", vengano anche cancellati tutti i record corrispondenti sulla tabella "interventi" .
Ecco la struttura delle 2 tabelle:
**persone**
Colonna | Tipo | Modificatori | Memorizzazione | Dest. stat. | Descrizione
---------+------------------------+-----------------------------------------------------------+----------------+-------------+-------------
id | integer | non null preimpostato nextval('persone_id_seq'::regclass) | plain | |
nome | character varying(100) | | extended | |
cognome | character varying(100) | | extended | |
email | character varying(355) | | extended | |
voto | integer | | plain | |
Indici:
"persone_pkey" PRIMARY KEY, btree (id)
**interventi**
Colonna | Tipo | Modificatori | Memorizzazione | Dest. stat. | Descrizione
------------+------------------------+--------------------------------------------------------------+----------------+-------------+-------------
id | integer | non null preimpostato nextval('interventi_id_seq'::regclass) | plain | |
descr | character varying(200) | | extended | |
prezzo | numeric(10,2) | | main | |
id_persona | integer | | plain | |
Indici:
"interventi_pkey" PRIMARY KEY, btree (id)
Applichiamo il vincolo di integrita' referenziale con nome "integrita_referenziale":
ALTER TABLE interventi ADD CONSTRAINT integrita_referenziale FOREIGN KEY (id_persona) REFERENCES persone(id) ON DELETE CASCADE;
Eliminiamo il vincolo:
ALTER TABLE interventi DROP CONSTRAINT integrita_referenziale ;