1 Vincoli Ci sono i vincoli predefiniti ( unique, primary key, not null, foreign key … ) In SQL2 si ha anche check check Condizione Serve per dare condizioni di correttezza della BD ed è molto potente
2 Vincoli Esempio: create table Impiegato (Matr character(6) check (Matr is not null and 1 = (select count(*) from Impiegato I where Matr = I.Matr)), Cogn character(20) check (Cogn is not null and 2 > (select count(*) from Impiegato I where Nome = I.Nome and Cogn = I.Cogn)), Nome character(20) check (Nome is not null and 2 > (…)), Dip character(5) check (Dip in (select NomeD from Dipartimento)))
3 Vincoli Esempio: create table Impiegato (Matr character(6) check (Matr is not null and 1 = (select count(*) from Impiegato I where Matr = I.Matr)), Cogn character(20) check (Cogn is not null and 2 > (select count(*) from Impiegato I where Nome = I.Nome and Cogn = I.Cogn)), Nome character(20) check (Nome is not null and 2 > (…)), Dip character(5) check (Dip in (select NomeD from Dipartimento))) Vincolo di integrità Un solo impiegato con stesso nome/ cognome
4 Vincoli Esempio: create table Impiegati (Matr … primary key, Cogn … not null, Nome … not null, Dip … references Dipartimento(NomeD), unique(Cogn,Nome)) Così è più semplice (e più efficiente dal punto di vista dell’implementazione) ma check utile per vincoli complessi (per esempio, libro pagina 138)
5 Vincoli Proviamo aggiungere 2, Laura, Rubini alla tabella (dunque, Matr è 2): MatrNomeCognome 1MarioRossi 2FrancoVerde 3AndreaNero 4LucaBianco 2LauraRubini Impiegato
6 Vincoli Crea una copia della tabella Impiegato I MatrNomeCognome 1MarioRossi 2FrancoVerde 3AndreaNero 4LucaBianco 2LauraRubini
7 Vincoli Diciamo che “Matr=2”; controllare check (Matr is not null and 1 = (select count(*) from Impiegato I where Matr = I.Matr)) I MatrNomeCognome 1MarioRossi 2FrancoVerde 3AndreaNero 4LucaBianco 2LauraRubini
8 Vincoli Diciamo che “Matr=2”; controllare check (Matr is not null and 1 = (select count(*) from Impiegato I where Matr = I.Matr)) I MatrNomeCognome 1MarioRossi 2FrancoVerde 3AndreaNero 4LucaBianco 2LauraRubini 2 volte!
9 Vincoli Diciamo che “Matr=2”; controllare check (Matr is not null and 1 = (select count(*) from Impiegato I where Matr = I.Matr)) I MatrNomeCognome 1MarioRossi 2FrancoVerde 3AndreaNero 4LucaBianco 2LauraRubini 2 volte!
10 Vincoli Diciamo che “Matr=2”; controllare check (Matr is not null and 1 = (select count(*) from Impiegato I where Matr = I.Matr)) I MatrNomeCognome 1MarioRossi 2FrancoVerde 3AndreaNero 4LucaBianco 2LauraRubini 2 volte! 2 non è uguale a 1
11 Vincoli Diciamo che “Matr=2”; controllare check (Matr is not null and 1 = (select count(*) from Impiegato I where Matr = I.Matr)) I MatrNomeCognome 1MarioRossi 2FrancoVerde 3AndreaNero 4LucaBianco 2LauraRubini 2 volte! 2 non è uguale a 1 Vincolo non è soddisfato!!!