−Indice
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 ;