Linguaggio SQL – Vincoli di integrità dei dati

Linguaggio SQL

Vincoli di integrità dei dati

Un database non deve solamente memorizzare i dati, ma garantire che i dati memorizzati siano corretti; se i dati sono imprecisi o incoerenti, l’integrità di tali dati può essere violata, minando l’affidabilità del database.

Per garantire l’integrità dei dati (data integrity), il linguaggio SQL fornisce vari vincoli di integrità, regole che vengono applicate alle tabelle e che vincolano i valori che possono essere inseriti. E’ possibile applicare vincoli su singole colonne o anche su più tabelle.

L’integrità dei dati, praticamente, impone delle restrizioni sui valori assunti da colonne e tabelle in un database. I vincoli di integrità di dati possono essere di tre tipi:

integrità sulle colonne Restrizioni sui valori assunti da una colonna
integrità sulle tabelle Restrizioni sui valori assunti da tutte le righe di una tabella
integrità referenziale Restrizioni sui valori assunti dalle colonne in comune delle tabelle in relazione

Nella fase di realizzazione, il compito del programmatore è quello di tradurre i vincoli sui dati previsti nella fase del progetto e dello schema logico del database mediante le istruzioni del linguaggio per la definizione dei dati.

I vincoli di integrità possono comparire:

  • dopo la definizione di una colonna, quando riguardano soltanto questa;
  • al termine della definizione di tutte le colonne, quando riguardano l’intera tabella e quindi più di una colonna.

La tabella seguente schematizza le clausole SQL utilizzate per imporre l’integrità dei dati.

Tipi di Integrità Clausole SQL
sulle colonne DEFAULT | CHECK | NOT NULL
sulle tabelle PRIMARYKEY | UNIQUE | CHECK
referenziale FOREIGN KEY | REFERENCES

Vincoli di integrità su una colonna

I vincoli di integrità su una colonna servono per definire dei valori predefiniti, un sottoinsieme di valori che può assumere una determinata colonna o delle condizioni che devono essere rispettate dai valori assegnati a una colonna.

Valori di default

Quando si definisce una nuova colonna è possibile definire un valore predefinito (default), aggiungendo la parola chiave DEFAULT. In tal modo, all’inserimento di una nuova tupla, se l’utente non digita alcun valore per quella colonna, il DBMS assegnerà automaticamente il valore di default e non il valore NULL.

Vincoli sui valori di una colonna

I vincoli CHECK impongono l’integrità dei dati limitando i valori che gli utenti possono immettere in una colonna. Per determinare se i dati sono validi, i vincoli CHECK applicano un’espressione logica utilizzando sia i classici operatori di confronto che gli operatori IN, LIKE e BETWEEN.
In particolare:

  • l’operatore BETWEEN limita i valori ammissibili a un intervallo compreso tra (BETWEEN) un valore iniziale e (AND) un valore finale,
  • l’operatore IN consente l’inserimento di uno tra i valori presenti in un insieme specificato,
  • l’operatore LIKE impone, su colonne di tipo stringa, che i valori di una colonna assumano un determinato formato attraverso l’utilizzo dei caratteri speciali _ (per indicare un qualsiasi carattere unico) e  % (per indicare una sequenza di caratteri di lunghezza qualsiasi, anche zero).

Colonne con valori NULL

Per indicare che un colonna non può assumere valore nullo, occorre definire il vincolo NOT NULL nella specifica della colonna. Il valore NULL è il valore predefinito se non specificato diversamente tramite la parola chiave DEFAULT.

Vincoli di integrità su una tabella

I vincoli di integrità su una tabella impongono delle regole che devono essere rispettate da tutte le righe (tuple) di una tabella. Tra questi vincoli vi sono quelli per la definizione delle chiavi, tra cui la chiave primaria, e quelli che impongono delle regole sui valori assunti da due o più colonne.

Vincolo di chiave primaria

Il principale vincolo di integrità su una tabella è quello che definisce la sua chiave primaria (PRIMARY KEY); sia che si tratti di una singola colonna (chiave semplice o atomica) o di più colonne (chiave composta o multipla), la chiave primaria è unica.
Se la chiave primaria è semplice, il vincolo di tabella sulla chiave può essere usato anche come vincolo di colonna aggiungendo le parole chiave PRIMARY KEY nella definizione della relativa colonna.

Il vincolo di unicità UNIQUE

Per dichiarare una o più colonne i cui valori devono essere necessariamente distinti all’interno di una tabella e che non formano una chiave primaria, SQL prevede il vincolo; tale clausola UNIQUE definisce una che, a differenza della chiave primaria, può assumere valori nulli (NULL).
In una tabella è possibile specificare più chiavi UNIQUE ma una sola PRIMARY KEY.

Se la superchiave è semplice, il vincolo di tabella di unicità può essere usato anche come vincolo di colonna aggiungendo la keyword UNIQUE nella definizione della relativa colonna.

Vincolo su più colonne con CHECK

La clausola CHECK può essere anche usata per imporre restrizioni su una combinazione dei valori assunti da due oppure più colonne in una tabella.
Nel caso di restrizione su una colonna, CHECK è un vincolo di colonna e può essere scritto o alla fine della dichiarazione della colonna stessa o alla fine della tabella; se le restrizioni riguardano più colonne, CHECK diventa vincolo di tabella e deve essere scritto alla fine della dichiarazione della tabella stessa.

Di seguito un esempio di utilizzo di alcuni vincoli di integrità su una colonna e integrità su una tabella:

[code language=”sql” gutter=”true” collapse=”false”]
CREATE TABLE Alunni
(
Codice CHAR(8) CHECK (Codice LIKE ‘ITE-__’),
CodiceFiscale CHAR(16) UNIQUE,
Cognome CHAR(20) NOT NULL,
Nome CHAR(20) NOT NULL,
DataNascita DATE CHECK (Anno BETWEEN 1995 AND 2016 ) NOT NULL,
LuogoNascita CHAR(30) DEFAULT ‘Castelvenere’,
Classe CHAR(4) CHECK (Classe IN (‘IA’, ‘IIA’, ‘IIIA’, ‘IVA’, ‘IVB’, ‘VA’) NOT NULL,

PRIMARY KEY(Codice)
)
[/code]

Vincoli di integrità referenziale

I vincoli di integrità referenziale coinvolgono le relazioni esistenti tra le tabelle di base dello schema logico. Questo tipo di vincolo può essere applicato sia a una relazione uno a molti, dichiarando esplicitamente la chiave esterna nella tabella esterna (lato molti) sia a una relazione uno a uno, considerata come caso particolare di quella uno a molti, in cui una delle due chiavi primarie è anche la chiave esterna.

Per imporre il vincolo di integrità referenziale in SQL, la colonna (o le colonne) in comune della tabella esterna deve essere dichiarata come chiave esterna (FOREIGN KEY) secondo questo costrutto:

FOREIGN KEY (Colonna-Tabella-Esterna)

REFERENCES Nome-Tabella-Interna (Colonna-Tabella-Interna)

[ON DELETE {CASCADE | NO ACTION | SET NULL | SET DEFAULT}]

[ON UPDATE {CASCADE | NO ACTION I|SET NULL | SET DEFAULT}]

Nel codice sorgente la definizione della tabella esterna deve sempre seguire la dichiarazione della tabella interna. Infatti, la definizione della chiave esterna fa riferimento (REFERENCES) alla chiave primaria della tabella interna, che deve essere già stata dichiarata in precedenza.

Ecco un esempio:

[code language=”sql” gutter=”true” collapse=”false”]
CREATE TABLE Alunni
(
Codice CHAR(8) CHECK (Codice LIKE ‘ITE-__’),
Cognome CHAR(20) NOT NULL,
Nome CHAR(20) NOT NULL,
DataNascita DATE NOT NULL,
Classe CHAR(4) NOT NULL,

PRIMARY KEY(Codice)
)

CREATE TABLE Assenze
(
ID INTEGER IDENTITY(1,1),
Studente CHAR(8),
Tipo CHAR(2) CHECK (Tipo IN (‘AA’, ‘AG’)) DEFAULT ‘AA’,
Giorno INTEGER CHECK (Giorno BETWEEN 1 AND 31) NOT NULL,
Mese CHAR(9) CHECK (Mese IN (‘settembre’, ‘ottobre’, ‘novembre’, ‘dicembre’, ‘gennaio’, ‘febbraio’, ‘marzo’, ‘aprile’, ‘maggio’, ‘giugno’)) NOT NULL,
Anno INTEGER CHECK (Anno BETWEEN 1995 AND 2016 ) NOT NULL,

PRIMARY KEY (ID),
FOREIGN KEY (Studente) REFERENCES Alunni(Codice)
)
[/code]

In alternativa alla dichiarazione come vincolo di tabella, l’integrità referenziale può essere definita come vincolo di colonna:

[code language=”sql” gutter=”true” collapse=”false”]
CREATE TABLE Alunni
(

)

CREATE TABLE Assenze
(
ID INTEGER IDENTITY(1,1),
Studente CHAR(8) REFERENCES Alunni(Codice),

PRIMARY KEY (ID),
)
[/code]

Le opzioni ON DELETE e ON UPDATE impongono ai DBMS le azioni seguenti:

CASCADE propagare in “cascata” (CASCADE) le cancellazioni (DELETE) oppure le modifiche (UPDATE) anche alla tabella dal lato molti
NO ACTION impedire il tentativo di cancellazione o modifica annullando l’intera operazione.
SET NULL
SET DEFAULT
assegnare alla chiave esterna il valore NULL (se si usa SET NULL) oppure il valore di default (se si usa SET DEFAULT)

In genere, nei DBMS l’opzione NO ACTION è quella di default, accompagnata da un messaggio di errore per l’utente che segnala il tentativo di violazione dell’integrità referenziale.

Visite: 606