2. Data Definition Language
Viste
Tramite le viste possiamo creare delle «tabelle virtuali»
- ogni volta che lo riteniamo utile, per semplificare una query complessa
- obbligatoriamente, se dobbiamo calcolare aggregati di aggregati
Sintassi:
CREATE VIEW NomeVista(ListaAttributi) AS QuerySQL
Creazione di Tabelle
Ex.
CREATE TABLE Impiegato (
Matricola CHAR(6),
Nome VARCHAR(20) NOT NULL,
Cognome VARCHAR(20) NOT NULL,
CF CHAT(16),
Qualifica VARCHAR(20) DEFAULT "Impiegato",
Stipendio FLOAT
)
Per le colonne che non accettano valori nulli è necessario specificare NOT NULL
.
E’ possibile indicare un valore di default per ogni colonna, utilizzando il costrutto DEFAULT
valore
.
Oltre al nome e al dominio degli attributi, si possono specificare altri vincoli che vanno a dettagliare ulteriormente le relazioni.
I vincoli possono essere:
- intra-relazionali se coinvolgono una sola relazione (es. chiave primaria)
- inter-relazionali se coinvolgono due o più relazioni (es. integrità referenziale)
I vincoli si indicano con specifici costrutti posizionati:
- se coinvolgono un solo attributo di seguito al relativo dominio oppure in coda alla
CREATE TABLE
- se coinvolgono due o più attributi in coda alla
CREATE TABLE
Vincoli Intra-Relazionali
I principali vincoli intra-relazionali (relativi a singole tabelle) sono:
PRIMARY KEY
: chiave primaria (implicaUNIQUE
+NOT NULL
)
UNIQUE
: non ammette valori duplicati nella tabella
CHECK
: limita il range di valori utilizzabili in una colonna
CREATE TABLE Impiegato (
Matricola CHAR(6) PRIMARY KEY,
Nome VARCHAR(20) NOT NULL,
Cognome VARCHAR(20) NOT NULL,
CF CHAT(16) UNIQUE,
Qualifica VARCHAR(20) DEFAULT "Impiegato",
Stipendio FLOAT CHECK(Stipendio>0)
)
Vincoli Inter-Relazionali
I vincoli inter-relazionali più significativi sono i vincoli di integrità referenziale (o vincoli di chiave esterna).
Questi vincoli creano un legame tra i valori di un attributo della tabella che stiamo creando (interna) e i valori di un attributo di un’altra tabella (esterna).
I vincoli di integrità referenziale si possono indicare:
- se coinvolgono un solo attributo delle tabelle
- di seguito al dominio dell’attributo, con il costrutto
REFERENCES
- in coda alla
CREATE TABLE
, con il costruttoFOREIGN KEY
- di seguito al dominio dell’attributo, con il costrutto
- se coinvolgono due o più attributi delle tabelle
- in coda alla
CREATE TABLE
, con il costruttoFOREIGN KEY
- in coda alla
Attenzione:
- le due colonne interessate dal vincolo di integrità referenziale devono avere lo stesso identico domino (compresa la dimensione)
- l’attributo della tabella esterna a cui si fa riferimento deve essere soggetto a
vincolo
UNIQUE
oPRIMARY KEY
Si devono definire (nella tabella interna) le politiche ON UPDATE
e ON DELETE
per specificare i comportamenti da seguire a seguito di modifiche o eliminazioni di tuple nella tabella esterna.
Possibili valori (ON UPDATE
... , ON DELETE
... ):
- CASCADE: aggiorna il valore (o cancella la tupla) anche nella tabella interna
- SET NULL: il valore viene impostato a NULL (se accettabile!)
- SET DEFAULT: il valore viene aggiornato al valore di default (se indicato!)
- NO ACTION: viene impedita l’operazione di modifica o cancellazione nella tabella esterna, se i valori interessati sono già utilizzati nella tabella interna
CREATE TABLE Studente(
Matricola INT(3) PRIMARY KEY,
Nome VARCHAR(32) NOT NULL,
Cognome VARCHAR(32) NOT NULL,
Comune CHAR(5) REFERENCES Comune(Codice) ON UPDATE CASCADE ON DELETE NO ACTION
)
Asserzioni
Le asserzioni permettono di creare vincoli generici e di disaccoppiare la definizione di vincoli dalla creazione delle tabelle. I vincoli espressi con il costrutto CREATE ASSERTION ... CHECK
possono essere sia intra-relazionali che inter-relazionali.
Esempio: la tabella PAZIENTIINCURA deve contenere al massimo 20 tuple.
CREATE ASSERTION MaxPazienti CHECK(
20 <= ( SELECT COUNT(*)
FROM PazientiInCura)
)