====== 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 ;