Barra laterale

programmazione:postgresql:vincoli_di_controllo

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  ; 

programmazione/postgresql/vincoli_di_controllo.txt · Ultima modifica: 18/04/2018 - 15:48 (modifica esterna)