Linguaggio SQL – Gestione dei vincoli di integrità con esempi
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:
-----
CREATE TABLE Alunni
(
Codice CHAR(8) CHECK (Codice LIKE 'Classe-__'),
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)
)
-----
In alternativa alla dichiarazione come vincolo di tabella, l’integrità referenziale può essere definita come vincolo di colonna:
-----
CREATE TABLE Alunni
(
...
)
CREATE TABLE Assenze
(
ID INTEGER IDENTITY(1,1),
Studente CHAR(8) REFERENCES Alunni(Codice),
...
PRIMARY KEY (ID),
)
-----
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: 1678