Vincoli interrelazionali Vincoli interrelazionali Vincoli Interrelazionali

Transcript

Vincoli interrelazionali Vincoli interrelazionali Vincoli Interrelazionali
Vincoli interrelazionali
Vincoli di integrità referenziale
In SQL si usa il vincolo di foreign key (chiave esterna) per creare
un legame fra i valori di un attributo della tabella corrente (interna)
e un attributo di un’altra tabella (esterna). Si impone che per ogni
riga della tabella interna il valore dell’attributo sia presente nel
corrispondente attributo della tabella esterna.
L’attributo della tabella esterna deve essere unique.
Se l’attributo è unico allora si usa references.
Altrimenti si usa foreign key.
Vincoli interrelazionali
Es.
create table Impiegato
(
Matricola character(6) primary key,
Nome
character(20) not null,
Cognome
character(20) not null,
Dipart
character(15)
references Dipartimento(NomeDip),
Stipendio numeric(9) default 0,
unique (Cognome, Nome),
foreign key(Nome, Cognome)
references Anagrafica(Nome,Cognome)
)
Vincoli Interrelazionali
Per i vincoli visti l’inserimento di un valore che li viola viene
semplicemente impedito.
In caso di vincoli di integrità referenziale, quando la violazione
avviene per un cambiamento apportato alla tabella esterna, si hanno
diverse possibili reazioni associabili al comando di aggiornamento
che causa l’inconsistenza.
Modifica (comando update):
cascade il nuovo valore dell’attributo della tabella esterna viene
riportato su tutte le corrispondenti righe della tabella interna.
set null all’attributo referente viene assegnato il valore nullo.
set default all’attributo referente viene assegnato il valore di
default.
no action la modifica non viene consentita.
1
Vincoli Interrelazionali
Cancellazione (comando delete):
cascade tutte le corrispondenti righe della tabella interna
vengono cancellate.
set null all’attributo referente viene assegnato il valore nullo.
set default all’attributo referente viene assegnato il valore di
default.
no action la cancellazione non viene consentita.
Per applicare una delle politiche:
on < delete | update >
< cascade | set null | set default | no action >
subito dopo la specifica del riferimento
Modifica degli schemi
E’ possibile modificare gli schemi con i comandi alter e drop.
alter consente di modificare domini e schemi di tabelle.
alter domain NomeDominio
< set default ValDefault |
drop default |
add constraint DefVincolo |
drop constraint NomeVincolo >
Modifica degli Schemi
alter table NomeTabella <
alter column NomeAttributo
< set default NuovoDefault |
drop default >|
add constraint DefVincolo |
drop constraint NomeVincolo |
add column NomeAttributo |
drop column NomeAttributo
>
NB Quando si inserisce un nuovo vincolo, questo deve essere
soddisfatto dai dati già presenti
2
Modifica degli Schemi
Il comando drop permette di rimuovere dei componenti
drop < schema | domain | table | view |
assertion > NomeElemento
[ restrict | cascade ]
restrict specifica di non eseguire il comando in presenza di
oggetti non vuoti.
cascade implica che gli oggetti specificati vengano rimossi.
Inoltre vengono rimossi tutti gli oggetti da essi dipendenti.
Quindi, ATTENZIONE!!!!
Interrogazioni
Le interrogazioni in SQL sono formulate in modo dichiarativo
specificando cioè cosa si vuole ottenere e non come lo si vuole
ottenere.
L’interrogazione viene passata all’ottimizzatore di interrogazioni
(query optimizer) che fa parte del DBMS. Questo la analizza e la
traduce nel linguaggio di interrogazione interno al DBMS.
Per questo chi programma in SQL deve cercare di scrivere codice
leggibile e facilmente modificabile, piuttosto che efficiente.
Interrogazioni
L’istruzione base per le interrogazioni è select
select ListaAttributi
from ListaTabelle
[ where Condizione ]
(target list)
(clausola from)
(clausola where)
Più in dettaglio:
select AttrEspr [[as] Alias]{, AttrEspr [[as] Alias]}
from Tabella
[[as] Alias]{, Tabella [[as] Alias]}
[ where Condizione ]
Seleziona le righe che soddisfano la condizione where fra quelle
appartenenti al prodotto cartesiano delle tabelle in ListaTabelle.
Ogni colonna (tabella) può essere ridenominata con un alias.
3
Interrogazioni
Es.
Data una base di dati che contiene le tabelle:
IMPIEGATO(Nome, Cognome, Dipart, Ufficio, Stipendio, Città)
DIPARTIMENTO(Nome, Indirizzo,Città)
select Stipendio/12 as SalarioMensile
from
Impiegato
where Cognome = `Rossi`
Il risultato è una tabella con una colonna rinominata SalarioMensile
e tante righe quanti sono gli impiegati che si chiamano Rossi.
Se si usa * dopo select si selezionano tutti gli attributi
Maternità Madre Figlio
Luisa Maria
Luisa Luigi
Anna
Olga
Anna Filippo
Maria Andrea
Maria Aldo
Paternità
Padre
Sergio
Luigi
Luigi
Franco
Franco
Figlio
Franco
Olga
Filippo
Andrea
Aldo
Persone
Nome Età Reddito
Andrea 27
21
Aldo 25
15
Maria 55
42
Anna 50
35
Filippo 26
30
Luigi 50
40
Franco 60
20
Olga 30
41
Sergio 85
35
Luisa 75
87
Selezione e proiezione
Nome e reddito delle persone con meno di trenta anni
PROJNome, Reddito(SELEta<30(Persone))
select nome, reddito
from persone
where eta < 30
select p.nome as nome, p.reddito as reddito
from persone p
where p.eta < 30
4
Interrogazioni su più tabelle
Se si vogliono estrarre informazioni da più tabelle, si pone come
argomento della clausola from una lista delle tabelle.
Se si deve formulare un join, è possibile farlo esplicitando il
collegamento fra le due tabelle nella clausola where.
Es.
Estrarre i nomi degli impiegati e le città dove lavorano.
select
from
where
Impiegato.Nome, Impiegato.Cognome,
Dipartimento.Città
Impiegato, Dipartimento
Impiegato.Dipart = Dipartimento.Nome
Attenzione: specificare una lista di tabelle nella clausola from
senza specificare anche una condizione di join nella clausola
where equivale ad eseguire la query sul prodotto cartesiano delle
tabelle riportate nella lista!
5