SlideShare a Scribd company logo
1 of 83
SQL DDL
Data Definition Language
MySQL 5.6
1
MatteoCeserani22/04/2015
SQL
 SQL (Structured Query Language)
 Linguaggio dichiarativo standardizzato
 Definizione di basi di dati
 Manipolazione dei dati
 Supportato da tutti i DBMS commerciali
 Si distingue in due parti principali
 DDL (Data Definition Language)
 DML (Data Manipulation Language).
 I DBMS aggiungono al linguaggio anche funzioni
 SDL (Storage Definition Language)
 Sicurezza e controllo degli accessi
 Backup
 Non sono parte dello standard.
22/04/2015
2
MatteoCeserani
DDL - COMANDI FONDAMENTALI
 Creazione di una relazione (tabella) o di una base
di dati
 CREATE
 Modifica di una relazione
 ALTER
 Cancellazione di una relazione o di una base di dati
 DROP
22/04/2015
3
MatteoCeserani
CREAZIONE DI UNA BASE DI DATI
 Comando CREATE
 CREATE DATABASE <Nome Base di
Dati>;
 Creare una base di dati è come prendere un
contenitore vuoto per metterci dentro qualcosa: la
base di dati non contiene inizialmente nulla.
 Inoltre MySQL prevede che per poter manipolare
una base di dati occorra prima selezionarla
 USE <Nome Base di Dati>;
22/04/2015
4
MatteoCeserani
CREAZIONE DI UNA BASE DI DATI
 Esercizio
 Creiamo la base di dati per la gestione di un piccolo
albergo
 Anche senza sapere nulla di come funziona il nostro
albergo possiamo scrivere senz’altro il codice seguente
CREATE DATABASE Albergo;
USE Albergo;
22/04/2015
5
MatteoCeserani
CREAZIONE DI UNA RELAZIONE
 Sintassi del comando CREATE
 CREATE TABLE <nome-relazione>
(<specifica-colonna>
[,<specifica-colonna>]*);
 Le parentesi quadre indicano un’opzionalità
 L’asterisco indica la possibilità di ripetere più volte
un elemento
 Nel nostro caso è possibile inserire un numero arbitrario
di specifiche di colonna
22/04/2015
6
MatteoCeserani
CREAZIONE DI UNA RELAZIONE
 La specifica della colonna è così strutturata
 <nome-colonna> <dominio>
[DEFAULT <valore-di-default>]
 Il dominio di una colonna indica sostanzialmente il
tipo di dato della colonna stessa
 I tipi di dato dipendono dal particolare DBMS
utilizzato
 Esiste però una sostanziale uniformità
22/04/2015
7
MatteoCeserani
TIPI DI DATI PREDEFINITI
 MySQL 5.6 possiede diversi tipi di dati predefiniti
 L’utente ha la possibilità di creare nuovi tipi di dato, ma
per ora tralasceremo questa possibilità
 I tipi predefiniti si dividono in 3 categorie
fondamentali
 Tipi di dati numerici
 Tipi di dati carattere
 Tipi di dati temporali
 Si faccia riferimento alla documentazione on-line
 http://dev.mysql.com/doc/refman/5.6/en/data-types.html
22/04/2015
8
MatteoCeserani
UN VALORE PARTICOLARE - NULL
 I campi di una tabella possono assumere solo i
valori specifici del tipo di dato della colonna stessa
 Eccezione: NULL
 Il valore NULL è un valore speciale che può essere
assegnato a qualsiasi tipo di campo
 Non è pari a 0 o a qualcosa di simile, è un valore a
parte
 Se un campo non deve poter assumere valore nullo si
specifica la clausola NOT NULL
22/04/2015
9
MatteoCeserani
TIPI DI DATI NUMERICI
 Tipi interi
 TINYINT
 SMALLINT
 INTEGER, INT
 MEDIUMINT
 BIGINT
 Tipi reali a virgola fissa
 NUMERIC
 DECIMAL
 Tipi reali a virgola mobile
 FLOAT
 DOUBLE
22/04/2015
10
MatteoCeserani
TIPI INTERI
 I tipi interi rappresentano i numeri interi utilizzando
una certa quantità di Byte
 A seconda del numero di bit utilizzati si ottiene un range
diverso di valori ammissibili
 Varia la quantità di memoria occupata dai record
 I tipi interi possono riferirsi a
 numeri interi senza segno (solo positivi)
 numeri interi con il segno (positivi e negativi)
 quando si dichiara un campo di una tabella occorre
specificare la natura dei numeri interi
 SIGNED (default)
 UNSIGNED
22/04/2015
11
MatteoCeserani
TIPI INTERI
22/04/2015
12
MatteoCeserani
TIPI INTERI
 Attributi particolari dei tipi interi
 INT(N)
 Visualizza il numero intero utilizzando N cifre
 Il numero di bit memorizzati non cambia!
 Se le cifre sono meno di N
 Si inseriscono degli spazi
 ZEROFILL Si inseriscono degli zero
 AUTO_INCREMENT
 Se si memorizza un valore 0 o un valore NULL dentro una
colonna AUTO_INCREMENT il campo assume il primo valore
non utilizzato
22/04/2015
13
MatteoCeserani
TIPI REALI A VIRGOLA MOBILE
 Un numero a virgola mobile viene rappresentato
come composto da un segno, una mantissa e da un
esponente
 In informatica si utilizza in genere questo standard
 s = 0, 1
 b = 2
 M = (1.bnbn-1…b1b0)2
 e = (bmbm-1…b1b0)2
22/04/2015
14
MatteoCeserani
es
bMa  )1(
TIPI REALI A VIRGOLA MOBILE
 FLOAT
 32 bit
 1 bit per il segno
 23 bit per la mantissa
 8 bit per l’esponente
 DOUBLE
 64 bit
 1 bit per il segno
 52 bit per la mantissa
 11 bit per l’esponente
 I tipi reali a virgola mobile devono essere usati per
rappresentare numeri molto grandi o molto piccoli
22/04/2015
15
MatteoCeserani
TIPI REALI A VIRGOLA FISSA
 Per valori numerici non eccessivamente grandi o
piccoli si possono utilizzare i tipi reali a virgola fissa
 NUMERIC
 DECIMAL
 MySQL implementa i tipi NUMERIC e DECIMAL nello
stesso identico modo
 Possono essere utilizzati in maniera assolutamente
intercambiabile
 Perché hanno fatto così?
 Probabilmente perché gli standard SQL prevedono due tipi
22/04/2015
16
MatteoCeserani
TIPI REALI A VIRGOLA FISSA
 Sintassi per la definizione di numeri a virgola fissa
 NUMERIC(<Precisione>,<Scala>)
 DECIMAL(<Precisione>,<Scala>)
 Precisione
 Numero di cifre significative
 Scala
 Numero di cifre dopo la virgola
22/04/2015
17
MatteoCeserani
TIPI REALI A VIRGOLA FISSA
 Esempio
 NUMERIC(7,3)
 7 cifre totali
 3 cifre dopo la virgola
 Valore minimo: -9999.999
 Valore massimo: 9999.999
 Massimo numero di cifre per i tipi in virgola fissa in
MySQL 5.6
 65
22/04/2015
18
MatteoCeserani
TIPI NUMERICI SPECIALI - BIT
 MySQL possiede un tipo numerico generico
 BIT
 BIT(M)
 Memorizza M valori binari
 Massimo valore di M
 64
 Se si assegna a un campo BIT(M) un numero di
bit inferiore a M le posizioni più significative restanti
vengono poste a 0
22/04/2015
19
MatteoCeserani
TIPI NUMERICI SPECIALI - BOOLEAN
 Il tipo BOOLEAN (o anche BOOL) permette di creare
campi di natura logica
 Un campo BOOL può assumere solo due valori
 TRUE
 FALSE
 In realtà BOOLEAN e BOOL sono semplici alias di
TINYINT(1)
 Il valore 0 corrisponde a FALSE, qualsiasi altro valore
corrisponde a vero
 In effetti FALSE è un alias di 0
 In realtà come costante TRUE è un alias di 1
22/04/2015
20
MatteoCeserani
TIPI NUMERICI SPECIALI - BOOLEAN
 I campi BOOLEAN sono legati agli operatori logici
 Operatori fondamentali: AND, OR, NOT
 Gli operatori logici si applicano a qualsiasi
espressione di cui si può valutare la verità
 Es. (Numero > 0 AND Numero <= 10) OR
(Esiste = NULL)
22/04/2015
21
MatteoCeserani
A B T F
T T F
F F F
A B T F
T T T
F T F
A
T F
F T
A AND B A OR B NOT A
TIPI CARATTERE
 CHAR(N)
 Stringa di caratteri a lunghezza fissa
 Valore massimo di N: 255
 VARCHAR(N)
 Stringa di caratteri a lunghezza variabile
 Valore massimo di N: 65535
22/04/2015
22
MatteoCeserani
TIPI CARATTERE
 VARCHAR utilizza la prima parte del campo per
specificare la lunghezza del valore che contiene
 Da VARCHAR(1) a VARCHAR(255)
 1 Byte per esprimere la lunghezza
 Da VARCHAR(256) a VARCHAR(65535)
 2 Byte per esprimere la lunghezza
22/04/2015
23
MatteoCeserani
TIPI CARATTERE
 Quanti byte servono per memorizzare un carattere?
 Dipende da CHARACTER SET che si utilizza
 MySQL supporta una trentina di set di caratteri
 Il più famoso è probabilmente UTF-8
 UTF-8
 Ogni carattere viene rappresentato con un numero di
byte che va da 1 a 4
 1 Byte per i caratteri ASCII standard
 Più Byte per tutti gli altri
 Più un carattere è comune meno Byte vengono utilizzati
22/04/2015
24
MatteoCeserani
TIPI CARATTERE
 Con la codifica UTF-8 si possono memorizzare tutti
i caratteri esistenti sul pianeta
 In attesa che arrivino gli alieni
 Come si setta la codifica UTF-8 in MySQL?
 Per un singolo database
 CREATE DATABASE mydb
DEFAULT CHARACTER SET utf8
DEFAULT COLLATE utf8_general_ci;
 Una COLLATION è un insieme di regole che stabilisce
i criteri con i quali vengono confrontati tra loro i
caratteri appartenenti a un particolare CHARACTER
SET
22/04/2015
25
MatteoCeserani
TIPI CARATTERE
 BINARY(N) e VARBINARY(N)
 Funzionano come CHAR e VARCHAR ma utilizzano un
byte per tutti i caratteri
 Le differenze sono le seguenti
 Non è definito un character set
 Non è definita nessuna collation
 I confronti vengono fatti sulla base del valore binario
22/04/2015
26
MatteoCeserani
TIPI CARATTERE
 BLOB e TEXT
 BLOB: Binary Large Object
 Funziona come BINARY ma può assumere dimensioni
maggiori
 TEXT
 Funziona come VARCHAR ma può assumere dimensioni
maggiori
 Esistono in 4 versioni
22/04/2015
27
MatteoCeserani
Dominio Dimensioni massime
TINYBLOB, TINYTEXT 256 B
BLOB, TEXT 64 kB
MEDIUMBLOB, MEDIUMTEXT 4 MB
LONGBLOB, LONGTEXT 4 GB
TIPI CARATTERE
 Enumerazioni
 ENUM(‘valore1’[, ‘valore2’]*)
 Una enumerazione definisce un campo che può
assumere come valori un insieme di stringhe definite
dall’utente al momento della sua creazione
 I valori letterali vengono convertiti in numeri quando
devono essere memorizzati e riconvertiti in stringhe
quando vengono recuperati attraverso query
 Vengono utilizzati numeri interi a partire da 0
 Lo 0 corrisponde alla stringa vuota
 Una stringa vuota viene memorizzata quando si tenta di
inserire un valore non valido in un campo ENUM
22/04/2015
28
MatteoCeserani
TIPI CARATTERE
 Enumerazioni
 Se un campo stringa può assumere solo pochi valori
conviene usare ENUM per risparmiare memoria
 Occorrono però alcune attenzioni, può nascere
confusione
 Se i valori letterali contengono cifre
 Quando le query devono restituire risultati ordinati
22/04/2015
29
MatteoCeserani
TIPI CARATTERE
 Insiemi
 SET(‘valore1’[, ‘valore2’]*)
 Un SET definisce un campo che può assumere come
valori un insieme di stringhe definite dall’utente al
momento della sua creazione
 In cosa differisce da un’enumerazione?
 Un campo SET può assumere come valore un qualsiasi
sottoinsieme delle stringhe definite come elementi del SET
22/04/2015
30
MatteoCeserani
TIPI CARATTERE
 Insiemi ed enumerazioni
 Mezzo ENUM(‘Automobile’, ‘Motocicletta’, ‘Furgone’,
‘Bicicletta’)
 Il campo Mezzo può assumere uno e uno solo dei valori
elencati
 Può assumere anche il valore NULL oppure ‘’ (stringa vuota)
 Mezzi SET(‘Automobile’, ‘Motocicletta’, ‘Furgone’,
‘Bicicletta’)
 Il campo Mezzi può assumere qualsiasi sottoinsieme dei valori
elencati
 Può assumere anche il valore NULL oppure ‘’ (stringa vuota)
22/04/2015
31
MatteoCeserani
TIPI CARATTERE
 Insiemi ed enumerazioni
22/04/2015
32
MatteoCeserani
Nome Mezzo
Matteo Ceserani NULL
Mario Rossi Automobile
Giovanni Calanzone Automobile
Dante Alighieri Motocicletta
Bill Gates Furgone
Clint Eastwood Bicicletta
Mario Rossi Furgone
TIPI CARATTERE
 Insiemi ed enumerazioni
22/04/2015
33
MatteoCeserani
Nome Mezzi
Matteo Ceserani Bicicletta, Automobile
Mario Rossi Automobile
Giovanni Calanzone Automobile, Furgone
Dante Alighieri Motocicletta
Bill Gates Furgone
Clint Eastwood Bicicletta, Furgone, Automobile
Achille Lauro NULL
TIPI TEMPORALI
 I tipi temporali permettono di gestire date e orari
 Tipi principali
 DATE
 DATETIME
 TIMESTAMP
 Tipi secondari
 TIME
 YEAR
22/04/2015
34
MatteoCeserani
TIPI TEMPORALI
 Tipo di dato DATE
 Il formato per le date è il formato standard
anglosassone
 YYYY-MM-DD
 Tipo di dato DATETIME
 YYYY-MM-DD HH:mm:SS
 Se si tenta di inserire una data non valida MySQL
memorizza la data nulla
 0000-00-00
 0000-00-00 00:00:00
22/04/2015
35
MatteoCeserani
TIPI TEMPORALI
 Tipo di dato TIMESTAMP
 Il tipo TIMESTAMP ha lo stesso formato di DATETIME ma si
riferisce alla data UTC
 UTC: Universal Coordinated Time
 In sostanza è l’ora media di Greenwich (GMT - Greenwich Mean
Time)
 Quando si memorizza un valore in un campo
TIMESTAMP il valore viene convertito dalla time zone
locale a UTC
 L’operazione inversa viene compiuta quando si recupera un
valore attraverso una query
 Il tutto in maniera trasparente all’utente
 Inoltre MySQL supporta l’inserimento e l’aggiornamento
automatico dei campi TIMESTAMP
 Limitazione importante
 Da 1970-01-01 00:00:00 a 2038-01-19 23:59:59
22/04/2015
36
MatteoCeserani
CREAZIONE DI UNA RELAZIONE
 Per creare le relazioni della base di dati Albergo
occorre conoscere la realtà che la base di dati
stessa deve modellare.
 Caratteristiche dell’albergo
 Caratteristiche del processo di gestione delle
prenotazioni e dell’accoglienza
 Più è approfondita tale conoscenza, maggiore sarà
la qualità del risultato della progettazione
 In questo contesto utilizzeremo un modello fortemente
semplificato, per motivi didattici
22/04/2015
37
MatteoCeserani
CREAZIONE DI UNA RELAZIONE
Si tratta di un piccolo hotel in una località marittima, con le stanze
distribuite su quattro piani; ci sono due stanze singole, due doppie,
sette matrimoniali e due triple; tutte le stanze matrimoniali hanno la
possibilità di aggiungere un terzo letto, e tre di queste, più grandi,
possono ospitarne anche un quarto; anche le due stanze triple
hanno la possibilità di aggiungere il quarto letto. Prevediamo anche
alcune caratteristiche che diversificano le camere: alcune hanno un
televisore, alcune hanno la vista sul mare, alcune hanno l’aria
condizionata e, infine, alcune sono riservate ai fumatori. Tuttavia,
come abbiamo detto prima, vogliamo semplificare un po’ le cose,
per cui stabiliamo che queste caratteristiche non incidono sul prezzo
della camera, che dipende invece esclusivamente dal periodo e dal
numero di posti letto. Prevediamo anche un costo fisso,
indipendente dalla stagione, per i letti aggiunti e per altri
supplementi come la culla in camera; infine decidiamo che il
trattamento standard fornito dal nostro hotel è la mezza pensione,
per cui chiederemo un supplemento per la pensione completa e
concederemo una riduzione per chi vuole solo bed & breakfast;
anche queste differenze saranno indipendenti dal periodo
stagionale.
22/04/2015
38
MatteoCeserani
CREAZIONE DI UNA RELAZIONE
22/04/2015
39
MatteoCeserani
-- Primi esempi di SQL DDL
-- Creazione di un database
CREATE DATABASE Hotel
DEFAULT CHARACTER SET utf8
DEFAULT COLLATE utf8_general_ci;
-- Selezione del database
USE Hotel;
 Il doppio trattino indica un commento
 Dal doppio trattino in poi è tutto commento fino alla
fine della riga
CREAZIONE DI UNA RELAZIONE
22/04/2015
40
MatteoCeserani
CREATE TABLE Camera(
Numero SMALLINT UNSIGNED NOT NULL,
Tipologia ENUM ('Doppia','Matrimoniale','Singola',
'Tripla') NOT NULL,
Caratteristiche SET ('VM','AC','TV','Sm','La1',
'La2'),
PRIMARY KEY (Numero)
);
 Qui c’è una novità:
 PRIMARY KEY
 Chiave Primaria
CHIAVE PRIMARIA
 Sottoinsieme degli attributi di una relazione che
permette l'individuazione univoca dei record della
relazione stessa.
 In sostanza non possono esistere due record della
relazione che possiedano gli stessi valori di chiave
primaria.
 Si intende che la chiave primaria può essere costituita
da più di un attributo, ma dovrebbe essere scelta come
un sottoinsieme MINIMO, cioè composto dal minor
numero possibile di attributi.
 Se si può si utilizza un attributo solo.
 In una relazione possono esistere più possibilità di
scelta della chiave primaria. In questo caso occorre fare
una scelta.
22/04/2015
41
MatteoCeserani
CHIAVE PRIMARIA
 Esistono due sintassi per dichiarare una chiave
primaria
 PRIMARY KEY (<Campo1> [, <Campo2>]*)
 Può essere sempre utilizzata
 In genere viene posta dopo la dichiarazione di tutti i campi
 <Campo> <Tipo> PRIMARY KEY
 Può essere utilizzata se la chiave primaria è composta da
un solo campo
22/04/2015
42
MatteoCeserani
CHIAVE PRIMARIA
 Un campo appartenente a una chiave primaria può
assumere valori nulli
 A rigor di logica però non è il caso di lasciare questa
possibilità
 Di solito si specifica sui campi chiave primaria il vincolo
NOT NULL
 Esiste inoltre la possibilità di specificare l’assenza
di duplicati su un campo che non appartiene alla
chiave primaria
 Si utilizza l’attributo UNIQUE
 Di fatto UNIQUE NOT NULL equivale a PRIMARY KEY
NOT NULL
22/04/2015
43
MatteoCeserani
CREAZIONE DI UNA RELAZIONE
22/04/2015
44
MatteoCeserani
CREATE TABLE Cliente(
Id SMALLINT UNSIGNED PRIMARY KEY NOT NULL
AUTO_INCREMENT,
Nome VARCHAR(100),
Cognome VARCHAR(100) NOT NULL,
DataN DATE,
CF CHAR(16) UNIQUE,
TipoD ENUM ('CI','P') NOT NULL,
NumeroD VARCHAR(30) NOT NULL UNIQUE
);
INDICI
22/04/2015
45
MatteoCeserani
 Insieme alle relazioni
MySQL crea
automaticamente alcuni
INDICI (INDEX) collegati alla
tabella
 Di default crea un indice per
i campi della chiave primaria
e per tutti i campi per cui è
espresso il vincolo UNIQUE
INDICI
 Quello degli indici è un meccanismo per rendere
più veloce la ricerca di informazioni nella relazione
 Si dice che alcuni campi della relazione vengono
indicizzati
 Quando un campo viene indicizzato il DBMS crea
una o più tabelle aggiuntive collegate alla tabella
principale e utilizzate dal DBMS in maniera
trasparente all'utente per rendere più veloci le
ricerche dei dati nel database
22/04/2015
46
MatteoCeserani
INDICI
 Per saperne di più
 Un approfondimento (in inglese, ovviamente…)
 Un esempio
 Indice non denso su chiave primaria
22/04/2015
47
MatteoCeserani
INDICI
 Creazione di un indice
 Sintassi
CREATE INDEX <NomeIndice> ON
<NomeRelazione> (<Campo1>[, <Campo2>]*);
 Si possono creare indici composti con un massimo di 16
campi
22/04/2015
48
MatteoCeserani
CREATE INDEX CognomeC ON
Cliente (Cognome);
INDICI
 Le tabelle indice occupano memoria
 Le tabelle indice devono essere aggiornate ogni volta
che si inserisce o cancella un record in una relazione
 Per questo motivo non si deve esagerare!
 In linea di massima è bene indicizzare
 Le chiavi primarie e i campi con vincolo UNIQUE
 I campi sui quali si prevede di eseguire numerose
ricerche
 Per esempio: il campo Cognome nella relazione
Cliente
22/04/2015
49
MatteoCeserani
VINCOLI INTRARELAZIONALI
 In generale è possibile specificare dei vincoli
aggiuntivi per limitare l’insieme di valori che un
campo può assumere.
 Vincoli di tipo CHECK
 Esistono due modi per inserirli
 Al momento della creazione della relazione
 A posteriori dopo aver creato la relazione
22/04/2015
50
MatteoCeserani
ALTER TABLE Cliente ADD CONSTRAINT Nascita CHECK
(DataN <= CURDATE());
CREATE TABLE Cliente(
...
DataN DATE CHECK (DataN <= CURDATE()),
CF CHAR(16) UNIQUE,
...
CONSTRAINT Codice CHECK (CHAR_LENGHT(CF) = 16)
);
VINCOLI INTRARELAZIONALI
 I vincoli CHECK sono comodissimi
 Provandoli con MySQL però si ha una gradevole
sorpresa
 MySQL esegue correttamente le istruzioni SQL che
contengono la parola chiave CHECK
 Però poi non esegue i controlli sui vincoli stessi!
 Dal manuale di MySQL
 The CHECK clause is parsed but ignored by all storage
engines
 Cioè: MySQL legge i comandi con clausola CHECK senza
segnalare errori ma poi ignora del tutto la clausola!
 La domanda è: perché?
 La risposta è un mistero
22/04/2015
51
MatteoCeserani
VINCOLI INTRARELAZIONALI
 Ma allora in MySQL come faccio?
 Esempio
 Per ora non approfondiamo
 Utilizziamo però questo codice all’occorrenza
22/04/2015
52
MatteoCeserani
DELIMITER //
CREATE TRIGGER Nascita BEFORE INSERT ON Cliente FOR EACH ROW
BEGIN
DECLARE Messaggio varchar(255);
IF (NEW.DataN > CURDATE())
THEN
SET Messaggio = concat(‘Vincolo Nascita violato: DataN
non può essere nel futuro!', NEW.DataN);
SIGNAL sqlstate '45000' SET message_text = Messaggio;
END IF;
END //
DELIMITER ;
VINCOLI INTRARELAZIONALI
 Altro esempio
 Non è difficile
 Occorre modificare la condizione di errore e il
messaggio a seconda delle esigenze
22/04/2015
53
MatteoCeserani
DELIMITER //
CREATE TRIGGER Codice BEFORE INSERT ON Cliente FOR EACH ROW
BEGIN
DECLARE Messaggio varchar(255);
IF NOT (CHAR_LENGHT(NEW.CF) = 16)
THEN
SET Messaggio = concat(‘Vincolo Codice violato: il
codice fiscale deve avere lunghezza 16!');
SIGNAL sqlstate '45000' SET message_text = Messaggio;
END IF;
END //
DELIMITER ;
VINCOLI INTRARELAZIONALI
 Con i trigger possiamo specificare vincoli più
complessi
 Per esempio vincoli che riguardano più campi nella
stessa relazione
 Per la sintassi dei trigger in generale fare
riferimento al manuale di MySQL
 http://dev.mysql.com/doc/refman/5.5/en/create-
trigger.html
22/04/2015
54
MatteoCeserani
CREAZIONE DI UNA RELAZIONE
 In realtà per il vincolo CHECK dovrei usare un
trigger
22/04/2015
55
MatteoCeserani
CREATE TABLE Prenotazione(
Id INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT,
Cliente SMALLINT UNSIGNED NOT NULL,
Camera SMALLINT UNSIGNED NOT NULL,
DataA DATE NOT NULL,
DataP DATE NOT NULL,
CONSTRAINT DataAP CHECK (DataP > DataA),
CONSTRAINT Duplicati UNIQUE KEY (Cliente, Camera, DataA)
);
CREAZIONE DI UNA RELAZIONE
22/04/2015
56
MatteoCeserani
CREATE TABLE Prenotazione(
Id INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT,
Cliente SMALLINT UNSIGNED NOT NULL,
Camera SMALLINT UNSIGNED NOT NULL,
DataA DATE NOT NULL,
DataP DATE NOT NULL,
CONSTRAINT Duplicati UNIQUE KEY (Cliente, Camera, DataA)
);
DELIMITER //
CREATE TRIGGER CheckPren BEFORE INSERT ON Prenotazione FOR EACH ROW
BEGIN
DECLARE Messaggio varchar(255);
IF (NEW.DataA >= NEW.DataP)
THEN
SET Messaggio = concat(‘Vincolo CheckPren violato!’);
SIGNAL sqlstate '45000' SET message_text = Messaggio;
END IF;
END //
DELIMITER ;
CREAZIONE DI UNA RELAZIONE
 Si noti come sia possibile definire il vincolo UNIQUE
su un insieme di attributi della relazione
 Il campo Cliente e il campo Camera non possono
assumere valori qualsiasi
 È ragionevole imporre che il numero identificativo del
cliente sia già presente nella relazione Cliente
 Stesso discorso occorre fare per il campo Camera
 Diciamo che Prenotazione.Cliente si riferisce a
Cliente.Id
 Diciamo che Prenotazione.Camera si riferisce a
Camera.Numero
22/04/2015
57
MatteoCeserani
VINCOLI INTERRELAZIONALI
 Quando un campo di una relazione deve riferirsi a
un campo di un’altra relazione siamo in presenza di
un vincolo interrelazionale
 Questo tipo di vincolo prende il nome di chiave
esterna (FOREIGN KEY)
 Sintassi
[CONSTRAINT <Nome>] FOREIGN KEY
<Referente> REFERENCES <Riferito>
[ON UPDATE <azione>]
[ON DELETE <azione>]
22/04/2015
58
MatteoCeserani
VINCOLI INTERRELAZIONALI
 Inseriamo le chiavi esterne nella relazione
Prenotazione
22/04/2015
59
MatteoCeserani
CREATE TABLE Prenotazione(
Id INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT,
Cliente SMALLINT UNSIGNED NOT NULL,
Camera SMALLINT UNSIGNED NOT NULL,
DataA DATE NOT NULL,
DataP DATE NOT NULL,
CONSTRAINT Duplicati UNIQUE KEY (Cliente, Camera, DataA),
CONSTRAINT FK_Cliente FOREIGN KEY
Prenotazione (Cliente) REFERENCES Cliente (Id)
ON UPDATE CASCADE
ON DELETE RESTRICT,
CONSTRAINT FK_Camera FOREIGN KEY
Prenotazione (Camera) REFERENCES Camera (Numero)
ON UPDATE CASCADE
ON DELETE RESTRICT
);
VINCOLI INTERRELAZIONALI
 Vincoli ON UPDATE e ON DELETE
 Specificano quali azioni intraprendere sulla relazione
quando un valore nel campo riferito viene modificato o
cancellato
 Valori possibili:
 CASCADE
 RESTRICT
 SET NULL
 NO ACTION
22/04/2015
60
MatteoCeserani
VINCOLI INTERRELAZIONALI
Azione Descrizione
CASCADE
Aggiorna o elimina tutti i record in cui è presente il
valore riferito
RESTRICT
Non permettere l’operazione di aggiornamento o
cancellazione nella relazione riferita
SET NULL
Assegna il valore null al campo referente in tutti i record
in cui è presente il valore riferito
NO ACTION Non fare nulla (in MySQL equivale a RESTRICT)
22/04/2015
61
MatteoCeserani
 Se non si specifica alcuna clausola ON DELETE e/o
ON UPDATE MySQL utilizza di default il valore
RESTRICT
VINCOLI INTERRELAZIONALI
 È ovviamente possibile inserire a posteriori una
chiave esterna in una relazione già creata
 Si utilizza il comando ALTER
 I campi coinvolti nelle chiavi esterne DEVONO
essere indicizzati in entrambe le relazioni
 Se un indice non è presente MySQL lo crea
automaticamente
22/04/2015
62
MatteoCeserani
ALTER TABLE Prenotazione
ADD CONSTRAINT FK_Camera FOREIGN KEY
Prenotazione (Camera) REFERENCES Camera (Numero)
ON UPDATE CASCADE
ON DELETE RESTRICT;
MODIFICARE UNA RELAZIONE
 Una tabella può essere modificata dopo essere
stata creata utilizzando il comando ALTER TABLE
 Sintassi:
 ALTER TABLE <Nome-Relazione>
<Specifica> [, <Specifica>]*
 Le specifiche possono essere moltissime
 Guardale tutte
 MySQL 5.5 Reference Manual (Alter Table)
22/04/2015
63
MatteoCeserani
MODIFICARE UNA RELAZIONE
 Un esempio relativo alle prenotazioni
 Una prenotazione richiede che si specifichi:
 Il tipo di servizio
 I letti aggiuntivi
 L’eventuale culla in camera
 Aggiungiamo i campi necessari
22/04/2015
64
MatteoCeserani
ALTER TABLE Prenotazione
ADD COLUMN Servizio ENUM("MP","PC","BB") NOT
NULL DEFAULT "MP" AFTER DataP,
ADD COLUMN Supplementi SET('LAg1','LAg2','Cu')
AFTER Servizio;
MODIFICARE UNA RELAZIONE
 Altre possibilità utilizzate spesso
 ALTER TABLE <Nome-Relazione>
DROP COLUMN <Nome-Attributo>;
 ALTER TABLE <Nome-Relazione>
MODIFY COLUMN <Nome-Attributo> <Tipo-
Attributo>;
 ALTER TABLE <Nome-Relazione> RENAME TO
<Nuovo-Nome>;
 ALTER TABLE <Nome-Relazione>
CHANGE COLUMN <Nome-Attributo> <Nuovo-Nome>
<Tipo-Attributo>;
22/04/2015
65
MatteoCeserani
MODIFICARE UNA RELAZIONE
 Un altro esempio sulla relazione Cliente
 Ci si può davvero sbizzarrire...
22/04/2015
66
MatteoCeserani
ALTER TABLE Cliente
ADD COLUMN Telefono VARCHAR(14),
ADD COLUMN Email VARCHAR(100);
ALTRE RELAZIONI DI SUPPORTO
22/04/2015
67
MatteoCeserani
CREATE TABLE Prezzi (
Tipologia ENUM ('Doppia', 'Matrimoniale',
'Singola', 'Tripla') NOT NULL PRIMARY KEY,
PrezzoA NUMERIC(6,2) NOT NULL,
PrezzoB NUMERIC(6,2) NOT NULL
);
CREATE TABLE Supplementi (
Tipo ENUM('LAg1','LAg2','Cu','P') NOT NULL
PRIMARY KEY,
Prezzo NUMERIC(6,2) NOT NULL
);
ALTRE RELAZIONI DI SUPPORTO
22/04/2015
68
MatteoCeserani
DELIMITER //
CREATE TRIGGER CheckPrezzi BEFORE INSERT ON Prezzi FOR EACH ROW
BEGIN
DECLARE Messaggio varchar(255);
IF (NEW.PrezzoA <= 0 OR NEW.PrezzoB <= 0 OR NEW.PrezzoA <
NEW.PrezzoB) THEN
SET Messaggio = concat("Vincolo sui prezzi violato! Ricontrolla
i valori.");
SIGNAL sqlstate '45000' SET message_text = Messaggio;
END IF;
END //
CREATE TRIGGER CheckPrezziSup BEFORE INSERT ON Supplementi FOR EACH ROW
BEGIN
DECLARE Messaggio varchar(255);
IF (NEW.Prezzo < 0) THEN
SET Messaggio = concat("Vincolo sui prezzi violato! Ricontrolla
i valori.");
SIGNAL sqlstate '45000' SET message_text = Messaggio;
END IF;
END //
DELIMITER ;
INSERIRE VALORI IN UNA RELAZIONE
 MySQL permette l’inserimento di valori in una
relazione in tre modi diversi
 Di base si utilizza sempre l’istruzione INSERT in
tre varianti differenti
 INSERT ... VALUES
 INSERT ... SET
 INSERT ... SELECT
22/04/2015
69
MatteoCeserani
INSERIRE VALORI IN UNA RELAZIONE
 INSERT ... VALUES
INSERT INTO <Nome-Relazione>
[(<Attributo>[,<Attributo>]*)]
{VALUES | VALUE}
({<Espressione> | DEFAULT},...)
[,({<Espressione> | DEFAULT},...)]*
[ON DUPLICATE KEY UPDATE
<Attributo> = <Espressione>
[,<Attributo> = <Espressione>]*]
22/04/2015
70
MatteoCeserani
INSERIRE VALORI IN UNA RELAZIONE
 Qualche esempio può chiarire meglio
22/04/2015
71
MatteoCeserani
INSERT INTO Camera VALUES
(101,"Singola","TV,AC,Sm"),
(401,"Singola","VM,TV,AC"),
(102,"Doppia","VM,TV,AC"),
(402,"Doppia","TV,AC"),
(103,"Tripla","La1,VM,TV,AC"),
(203,"Tripla","La1,TV,AC"),
(201,"Matrimoniale","La1,VM,TV,AC"),
(202,"Matrimoniale","La1,TV,AC"),
(301,"Matrimoniale","La1,VM,TV,AC"),
(302,"Matrimoniale","La1,TV,AC"),
(303,"Matrimoniale","La1,La2,VM,TV,AC"),
(403,"Matrimoniale","La1,La2,VM,TV,AC"),
(404,"Matrimoniale","La1,La2,VM,TV,AC");
INSERIRE VALORI IN UNA RELAZIONE
 I campi AUTO_INCREMENT supportano un
meccanismo di generazione automatica delle chiavi
 Nella INSERT si specifica il valore NULL
 Viene di fatto utilizzato il primo valore che non è mai
stato utilizzato in precedenza
 Se invece si specifica un valore il sistema utilizza il
valore specificato
22/04/2015
72
MatteoCeserani
INSERT INTO Cliente VALUES
(NULL,"Matteo", "Ceserani", "1975-08-27",
"CSRMTT75M27F205C", "CI", "AN123456"),
(NULL,"Mattia", "Cipriani", "1996-01-07",
"CPRMTT96A07E202C", "CI", "FG654321");
INSERIRE VALORI IN UNA RELAZIONE
 Una INSERT può determinare una violazione di un
vincolo PRIMARY KEY oppure FOREIGN KEY
 In questi casi è utile ricorrere al costrutto ON
DUPLICATE KEY UPDATE
 Se il sistema constata la violazione di un vincolo di
unicità aggiorna gli attributi necessari prima di eseguire
la INSERT
 In generale però si consiglia di non usare questo
costrutto nel caso in cui una tabella contenga più campi
con vincolo UNIQUE
22/04/2015
73
MatteoCeserani
INSERT INTO Cliente VALUES
(1,"Matteo","Ceserani","1975-08-27",
"CSRMTT75M27F205C", "CI", "AN123456")
ON DUPLICATE KEY UPDATE Id = LAST_INSERT_ID() + 1;
INSERIRE VALORI IN UNA RELAZIONE
 Attenzione però
 La funzione LAST_INSERT_ID() restituisce l’ultimo
valore inserito attraverso una INSERT in un campo
AUTO_INCREMENT
 Non si può però specificare la relazione in cui il record è
stato inserito!
 Viene restituito sempre l’ultimo valore
AUTO_INCREMENT generato nella base di dati, a
prescindere dalla relazione
 La INSERT della slide precedente funziona con
certezza solo se l’ultima INSERT eseguita si riferiva alla
relazione Cliente
22/04/2015
74
MatteoCeserani
INSERIRE VALORI IN UNA RELAZIONE
 È possibile specificare nella INSERT solo un
sottoinsieme degli attributi della relazione
 Es.
 Per i campi non indicati tra le parentesi vengono
utilizzati i valori di DEFAULT, se indicati, oppure il
valore NULL
 Nel caso di ENUM il valore di DEFAULT è il primo
riportato nella definizione della relazione
 Nel caso di SET invece se non è indicato, il valore di
DEFAULT è NULL
22/04/2015
75
MatteoCeserani
INSERT INTO
Cliente(Nome,Cognome,TipoD,NumeroD) VALUES
("Massimiliano","Bianchi","CI","AB123456");
INSERIRE VALORI IN UNA RELAZIONE
 INSERT ... SET
 Questo tipo di INSERT può essere utilizzato in
alternativa al più comune INSERT … VALUES
 Si tratta però di dialetto MySQL, non di SQL standard
 Es.
equivale a
22/04/2015
76
MatteoCeserani
INSERT INTO Cliente(Nome,Cognome,NumeroD) VALUES
("Massimiliano","Bianchi","AB123457");
INSERT INTO Cliente SET
Nome = "Massimiliano", Cognome = "Bianchi",
NumeroD = "AB123457";
INSERIRE VALORI IN UNA RELAZIONE
 INSERT ... SELECT
 Il costrutto INSERT ... SELECT permette di inserire
in una tabella valori ottenuti da una o più altre tabelle
 Es.
22/04/2015
77
MatteoCeserani
CREATE TABLE ClienteP(
Id SMALLINT UNSIGNED PRIMARY KEY NOT NULL AUTO_INCREMENT,
Nome VARCHAR(100),
Cognome VARCHAR(100) NOT NULL,
DataN DATE,
NumeroD VARCHAR(30) NOT NULL UNIQUE,
Telefono VARCHAR(14),
Email VARCHAR(100)
);
INSERT INTO ClienteP SELECT
Cliente.Id, Cliente.Nome, Cliente.Cognome, Cliente.DataN,
Cliente.NumeroD, Cliente.Telefono, Cliente.Email
FROM Cliente
WHERE Cliente.TipoD = "P";
ELIMINARE VALORI DA UNA RELAZIONE
 DELETE
 Sintassi
DELETE FROM <tbl_name>
[WHERE <where_condition>]
[LIMIT <row_count>];
 Es.
22/04/2015
78
MatteoCeserani
DELETE FROM Cliente WHERE
Cognome = "Massimiliano" LIMIT 1;
ELIMINARE RELAZIONI, VINCOLI E DATABASE
 DROP
 DROP DATABASE
 DROP TABLE
 DROP INDEX
 DROP TRIGGER
 Da usare con grande attenzione!
22/04/2015
79
MatteoCeserani
STORAGE ENGINES
 Uno storage engine è lo strato software che in un
DBMS si occupa di effettuare le operazioni CRUD
sui database
 Create
 Read
 Update
 Delete
 Di per sé si può vivere bene senza preoccuparsi
troppo dello storage engine che un DBMS sta
utilizzando
22/04/2015
80
MatteoCeserani
STORAGE ENGINES
 Molti DBMS supportano diversi tipi di storage
engines
 MySQL
 InnoDB
 MyISAM
 Memory
 Merge
 Archive
 Federated
 NDB
 CSV
 Blackhole
 Example
22/04/2015
81
MatteoCeserani
STORAGE ENGINES
 Confronto tra diversi storage engines
22/04/2015
82
MatteoCeserani
Feature MyISAM Memory InnoDB Archive NDB
Storage limits 256TB RAM 64TB None 384EB
Transactions No No Yes No Yes
Locking granularity Table Table Row Table Row
MVCC No No Yes No No
Geospatial data type support Yes No Yes Yes Yes
Geospatial indexing support Yes No No No No
B-tree indexes Yes Yes Yes No No
T-tree indexes No No No No Yes
Hash indexes No Yes No No Yes
Full-text search indexes Yes No Yes No No
Clustered indexes No No Yes No No
Data caches No N/A Yes No Yes
Index caches Yes N/A Yes No Yes
Compressed data Yes No Yes Yes No
Encrypted data Yes Yes Yes Yes Yes
Cluster database support No No No No Yes
Replication support Yes Yes Yes Yes Yes
Foreign key support No No Yes No No
Backup / point-in-time recovery Yes Yes Yes Yes Yes
Query cache support Yes Yes Yes Yes Yes
Update statistics for data dictionary Yes Yes Yes Yes Yes
STORAGE ENGINES
 Come impostare uno storage engine
22/04/2015
83
MatteoCeserani
CREATE TABLE ClienteP(
Id SMALLINT UNSIGNED PRIMARY KEY NOT NULL
AUTO_INCREMENT,
Nome VARCHAR(100),
Cognome VARCHAR(100) NOT NULL,
DataN DATE,
NumeroD VARCHAR(30) NOT NULL UNIQUE,
Telefono VARCHAR(14),
Email VARCHAR(100)
) Engine = InnoDB;

More Related Content

Similar to Sql ddl

corso web - Introduzione ai Database
corso web - Introduzione ai Databasecorso web - Introduzione ai Database
corso web - Introduzione ai DatabaseRiccardo Piccioni
 
IBM i db2 udb vs Microsoft SQL Server
IBM i db2 udb vs Microsoft SQL ServerIBM i db2 udb vs Microsoft SQL Server
IBM i db2 udb vs Microsoft SQL ServerRiccardo De Mattia
 
noSQL La nuova frontiera dei Database [DB05-S]
noSQL La nuova frontiera dei Database [DB05-S]noSQL La nuova frontiera dei Database [DB05-S]
noSQL La nuova frontiera dei Database [DB05-S]Andrea Maddalena
 
Access parte terza
Access parte terzaAccess parte terza
Access parte terzaMatekanc
 
Note di Data Warehouse e Business Intelligence - Tecniche di Naming Conventio...
Note di Data Warehouse e Business Intelligence - Tecniche di Naming Conventio...Note di Data Warehouse e Business Intelligence - Tecniche di Naming Conventio...
Note di Data Warehouse e Business Intelligence - Tecniche di Naming Conventio...Massimo Cenci
 
Access parte prima
Access parte primaAccess parte prima
Access parte primaMatekanc
 
Ecdl-modulo-5-basi-di-dati
Ecdl-modulo-5-basi-di-datiEcdl-modulo-5-basi-di-dati
Ecdl-modulo-5-basi-di-datiMatekanc
 
corso oracle plsql.ppt
corso oracle plsql.pptcorso oracle plsql.ppt
corso oracle plsql.pptssuserf7962d
 

Similar to Sql ddl (17)

SQL Unità 1 linguaggio DDL; DML, funzioni di aggregazione
SQL Unità 1 linguaggio DDL; DML, funzioni di aggregazioneSQL Unità 1 linguaggio DDL; DML, funzioni di aggregazione
SQL Unità 1 linguaggio DDL; DML, funzioni di aggregazione
 
corso web - Introduzione ai Database
corso web - Introduzione ai Databasecorso web - Introduzione ai Database
corso web - Introduzione ai Database
 
primi comandi SQL con Mysql
primi comandi SQL con Mysqlprimi comandi SQL con Mysql
primi comandi SQL con Mysql
 
Sql 1
Sql 1Sql 1
Sql 1
 
MySQL
MySQLMySQL
MySQL
 
Basi Di Dati 03
Basi Di Dati 03Basi Di Dati 03
Basi Di Dati 03
 
IBM i db2 udb vs Microsoft SQL Server
IBM i db2 udb vs Microsoft SQL ServerIBM i db2 udb vs Microsoft SQL Server
IBM i db2 udb vs Microsoft SQL Server
 
noSQL La nuova frontiera dei Database [DB05-S]
noSQL La nuova frontiera dei Database [DB05-S]noSQL La nuova frontiera dei Database [DB05-S]
noSQL La nuova frontiera dei Database [DB05-S]
 
Access parte terza
Access parte terzaAccess parte terza
Access parte terza
 
Database
DatabaseDatabase
Database
 
Introduction Dax
Introduction DaxIntroduction Dax
Introduction Dax
 
Note di Data Warehouse e Business Intelligence - Tecniche di Naming Conventio...
Note di Data Warehouse e Business Intelligence - Tecniche di Naming Conventio...Note di Data Warehouse e Business Intelligence - Tecniche di Naming Conventio...
Note di Data Warehouse e Business Intelligence - Tecniche di Naming Conventio...
 
Access parte prima
Access parte primaAccess parte prima
Access parte prima
 
3 Linguaggioc
3   Linguaggioc3   Linguaggioc
3 Linguaggioc
 
SQL Server2000
SQL Server2000SQL Server2000
SQL Server2000
 
Ecdl-modulo-5-basi-di-dati
Ecdl-modulo-5-basi-di-datiEcdl-modulo-5-basi-di-dati
Ecdl-modulo-5-basi-di-dati
 
corso oracle plsql.ppt
corso oracle plsql.pptcorso oracle plsql.ppt
corso oracle plsql.ppt
 

Sql ddl

  • 1. SQL DDL Data Definition Language MySQL 5.6 1 MatteoCeserani22/04/2015
  • 2. SQL  SQL (Structured Query Language)  Linguaggio dichiarativo standardizzato  Definizione di basi di dati  Manipolazione dei dati  Supportato da tutti i DBMS commerciali  Si distingue in due parti principali  DDL (Data Definition Language)  DML (Data Manipulation Language).  I DBMS aggiungono al linguaggio anche funzioni  SDL (Storage Definition Language)  Sicurezza e controllo degli accessi  Backup  Non sono parte dello standard. 22/04/2015 2 MatteoCeserani
  • 3. DDL - COMANDI FONDAMENTALI  Creazione di una relazione (tabella) o di una base di dati  CREATE  Modifica di una relazione  ALTER  Cancellazione di una relazione o di una base di dati  DROP 22/04/2015 3 MatteoCeserani
  • 4. CREAZIONE DI UNA BASE DI DATI  Comando CREATE  CREATE DATABASE <Nome Base di Dati>;  Creare una base di dati è come prendere un contenitore vuoto per metterci dentro qualcosa: la base di dati non contiene inizialmente nulla.  Inoltre MySQL prevede che per poter manipolare una base di dati occorra prima selezionarla  USE <Nome Base di Dati>; 22/04/2015 4 MatteoCeserani
  • 5. CREAZIONE DI UNA BASE DI DATI  Esercizio  Creiamo la base di dati per la gestione di un piccolo albergo  Anche senza sapere nulla di come funziona il nostro albergo possiamo scrivere senz’altro il codice seguente CREATE DATABASE Albergo; USE Albergo; 22/04/2015 5 MatteoCeserani
  • 6. CREAZIONE DI UNA RELAZIONE  Sintassi del comando CREATE  CREATE TABLE <nome-relazione> (<specifica-colonna> [,<specifica-colonna>]*);  Le parentesi quadre indicano un’opzionalità  L’asterisco indica la possibilità di ripetere più volte un elemento  Nel nostro caso è possibile inserire un numero arbitrario di specifiche di colonna 22/04/2015 6 MatteoCeserani
  • 7. CREAZIONE DI UNA RELAZIONE  La specifica della colonna è così strutturata  <nome-colonna> <dominio> [DEFAULT <valore-di-default>]  Il dominio di una colonna indica sostanzialmente il tipo di dato della colonna stessa  I tipi di dato dipendono dal particolare DBMS utilizzato  Esiste però una sostanziale uniformità 22/04/2015 7 MatteoCeserani
  • 8. TIPI DI DATI PREDEFINITI  MySQL 5.6 possiede diversi tipi di dati predefiniti  L’utente ha la possibilità di creare nuovi tipi di dato, ma per ora tralasceremo questa possibilità  I tipi predefiniti si dividono in 3 categorie fondamentali  Tipi di dati numerici  Tipi di dati carattere  Tipi di dati temporali  Si faccia riferimento alla documentazione on-line  http://dev.mysql.com/doc/refman/5.6/en/data-types.html 22/04/2015 8 MatteoCeserani
  • 9. UN VALORE PARTICOLARE - NULL  I campi di una tabella possono assumere solo i valori specifici del tipo di dato della colonna stessa  Eccezione: NULL  Il valore NULL è un valore speciale che può essere assegnato a qualsiasi tipo di campo  Non è pari a 0 o a qualcosa di simile, è un valore a parte  Se un campo non deve poter assumere valore nullo si specifica la clausola NOT NULL 22/04/2015 9 MatteoCeserani
  • 10. TIPI DI DATI NUMERICI  Tipi interi  TINYINT  SMALLINT  INTEGER, INT  MEDIUMINT  BIGINT  Tipi reali a virgola fissa  NUMERIC  DECIMAL  Tipi reali a virgola mobile  FLOAT  DOUBLE 22/04/2015 10 MatteoCeserani
  • 11. TIPI INTERI  I tipi interi rappresentano i numeri interi utilizzando una certa quantità di Byte  A seconda del numero di bit utilizzati si ottiene un range diverso di valori ammissibili  Varia la quantità di memoria occupata dai record  I tipi interi possono riferirsi a  numeri interi senza segno (solo positivi)  numeri interi con il segno (positivi e negativi)  quando si dichiara un campo di una tabella occorre specificare la natura dei numeri interi  SIGNED (default)  UNSIGNED 22/04/2015 11 MatteoCeserani
  • 13. TIPI INTERI  Attributi particolari dei tipi interi  INT(N)  Visualizza il numero intero utilizzando N cifre  Il numero di bit memorizzati non cambia!  Se le cifre sono meno di N  Si inseriscono degli spazi  ZEROFILL Si inseriscono degli zero  AUTO_INCREMENT  Se si memorizza un valore 0 o un valore NULL dentro una colonna AUTO_INCREMENT il campo assume il primo valore non utilizzato 22/04/2015 13 MatteoCeserani
  • 14. TIPI REALI A VIRGOLA MOBILE  Un numero a virgola mobile viene rappresentato come composto da un segno, una mantissa e da un esponente  In informatica si utilizza in genere questo standard  s = 0, 1  b = 2  M = (1.bnbn-1…b1b0)2  e = (bmbm-1…b1b0)2 22/04/2015 14 MatteoCeserani es bMa  )1(
  • 15. TIPI REALI A VIRGOLA MOBILE  FLOAT  32 bit  1 bit per il segno  23 bit per la mantissa  8 bit per l’esponente  DOUBLE  64 bit  1 bit per il segno  52 bit per la mantissa  11 bit per l’esponente  I tipi reali a virgola mobile devono essere usati per rappresentare numeri molto grandi o molto piccoli 22/04/2015 15 MatteoCeserani
  • 16. TIPI REALI A VIRGOLA FISSA  Per valori numerici non eccessivamente grandi o piccoli si possono utilizzare i tipi reali a virgola fissa  NUMERIC  DECIMAL  MySQL implementa i tipi NUMERIC e DECIMAL nello stesso identico modo  Possono essere utilizzati in maniera assolutamente intercambiabile  Perché hanno fatto così?  Probabilmente perché gli standard SQL prevedono due tipi 22/04/2015 16 MatteoCeserani
  • 17. TIPI REALI A VIRGOLA FISSA  Sintassi per la definizione di numeri a virgola fissa  NUMERIC(<Precisione>,<Scala>)  DECIMAL(<Precisione>,<Scala>)  Precisione  Numero di cifre significative  Scala  Numero di cifre dopo la virgola 22/04/2015 17 MatteoCeserani
  • 18. TIPI REALI A VIRGOLA FISSA  Esempio  NUMERIC(7,3)  7 cifre totali  3 cifre dopo la virgola  Valore minimo: -9999.999  Valore massimo: 9999.999  Massimo numero di cifre per i tipi in virgola fissa in MySQL 5.6  65 22/04/2015 18 MatteoCeserani
  • 19. TIPI NUMERICI SPECIALI - BIT  MySQL possiede un tipo numerico generico  BIT  BIT(M)  Memorizza M valori binari  Massimo valore di M  64  Se si assegna a un campo BIT(M) un numero di bit inferiore a M le posizioni più significative restanti vengono poste a 0 22/04/2015 19 MatteoCeserani
  • 20. TIPI NUMERICI SPECIALI - BOOLEAN  Il tipo BOOLEAN (o anche BOOL) permette di creare campi di natura logica  Un campo BOOL può assumere solo due valori  TRUE  FALSE  In realtà BOOLEAN e BOOL sono semplici alias di TINYINT(1)  Il valore 0 corrisponde a FALSE, qualsiasi altro valore corrisponde a vero  In effetti FALSE è un alias di 0  In realtà come costante TRUE è un alias di 1 22/04/2015 20 MatteoCeserani
  • 21. TIPI NUMERICI SPECIALI - BOOLEAN  I campi BOOLEAN sono legati agli operatori logici  Operatori fondamentali: AND, OR, NOT  Gli operatori logici si applicano a qualsiasi espressione di cui si può valutare la verità  Es. (Numero > 0 AND Numero <= 10) OR (Esiste = NULL) 22/04/2015 21 MatteoCeserani A B T F T T F F F F A B T F T T T F T F A T F F T A AND B A OR B NOT A
  • 22. TIPI CARATTERE  CHAR(N)  Stringa di caratteri a lunghezza fissa  Valore massimo di N: 255  VARCHAR(N)  Stringa di caratteri a lunghezza variabile  Valore massimo di N: 65535 22/04/2015 22 MatteoCeserani
  • 23. TIPI CARATTERE  VARCHAR utilizza la prima parte del campo per specificare la lunghezza del valore che contiene  Da VARCHAR(1) a VARCHAR(255)  1 Byte per esprimere la lunghezza  Da VARCHAR(256) a VARCHAR(65535)  2 Byte per esprimere la lunghezza 22/04/2015 23 MatteoCeserani
  • 24. TIPI CARATTERE  Quanti byte servono per memorizzare un carattere?  Dipende da CHARACTER SET che si utilizza  MySQL supporta una trentina di set di caratteri  Il più famoso è probabilmente UTF-8  UTF-8  Ogni carattere viene rappresentato con un numero di byte che va da 1 a 4  1 Byte per i caratteri ASCII standard  Più Byte per tutti gli altri  Più un carattere è comune meno Byte vengono utilizzati 22/04/2015 24 MatteoCeserani
  • 25. TIPI CARATTERE  Con la codifica UTF-8 si possono memorizzare tutti i caratteri esistenti sul pianeta  In attesa che arrivino gli alieni  Come si setta la codifica UTF-8 in MySQL?  Per un singolo database  CREATE DATABASE mydb DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;  Una COLLATION è un insieme di regole che stabilisce i criteri con i quali vengono confrontati tra loro i caratteri appartenenti a un particolare CHARACTER SET 22/04/2015 25 MatteoCeserani
  • 26. TIPI CARATTERE  BINARY(N) e VARBINARY(N)  Funzionano come CHAR e VARCHAR ma utilizzano un byte per tutti i caratteri  Le differenze sono le seguenti  Non è definito un character set  Non è definita nessuna collation  I confronti vengono fatti sulla base del valore binario 22/04/2015 26 MatteoCeserani
  • 27. TIPI CARATTERE  BLOB e TEXT  BLOB: Binary Large Object  Funziona come BINARY ma può assumere dimensioni maggiori  TEXT  Funziona come VARCHAR ma può assumere dimensioni maggiori  Esistono in 4 versioni 22/04/2015 27 MatteoCeserani Dominio Dimensioni massime TINYBLOB, TINYTEXT 256 B BLOB, TEXT 64 kB MEDIUMBLOB, MEDIUMTEXT 4 MB LONGBLOB, LONGTEXT 4 GB
  • 28. TIPI CARATTERE  Enumerazioni  ENUM(‘valore1’[, ‘valore2’]*)  Una enumerazione definisce un campo che può assumere come valori un insieme di stringhe definite dall’utente al momento della sua creazione  I valori letterali vengono convertiti in numeri quando devono essere memorizzati e riconvertiti in stringhe quando vengono recuperati attraverso query  Vengono utilizzati numeri interi a partire da 0  Lo 0 corrisponde alla stringa vuota  Una stringa vuota viene memorizzata quando si tenta di inserire un valore non valido in un campo ENUM 22/04/2015 28 MatteoCeserani
  • 29. TIPI CARATTERE  Enumerazioni  Se un campo stringa può assumere solo pochi valori conviene usare ENUM per risparmiare memoria  Occorrono però alcune attenzioni, può nascere confusione  Se i valori letterali contengono cifre  Quando le query devono restituire risultati ordinati 22/04/2015 29 MatteoCeserani
  • 30. TIPI CARATTERE  Insiemi  SET(‘valore1’[, ‘valore2’]*)  Un SET definisce un campo che può assumere come valori un insieme di stringhe definite dall’utente al momento della sua creazione  In cosa differisce da un’enumerazione?  Un campo SET può assumere come valore un qualsiasi sottoinsieme delle stringhe definite come elementi del SET 22/04/2015 30 MatteoCeserani
  • 31. TIPI CARATTERE  Insiemi ed enumerazioni  Mezzo ENUM(‘Automobile’, ‘Motocicletta’, ‘Furgone’, ‘Bicicletta’)  Il campo Mezzo può assumere uno e uno solo dei valori elencati  Può assumere anche il valore NULL oppure ‘’ (stringa vuota)  Mezzi SET(‘Automobile’, ‘Motocicletta’, ‘Furgone’, ‘Bicicletta’)  Il campo Mezzi può assumere qualsiasi sottoinsieme dei valori elencati  Può assumere anche il valore NULL oppure ‘’ (stringa vuota) 22/04/2015 31 MatteoCeserani
  • 32. TIPI CARATTERE  Insiemi ed enumerazioni 22/04/2015 32 MatteoCeserani Nome Mezzo Matteo Ceserani NULL Mario Rossi Automobile Giovanni Calanzone Automobile Dante Alighieri Motocicletta Bill Gates Furgone Clint Eastwood Bicicletta Mario Rossi Furgone
  • 33. TIPI CARATTERE  Insiemi ed enumerazioni 22/04/2015 33 MatteoCeserani Nome Mezzi Matteo Ceserani Bicicletta, Automobile Mario Rossi Automobile Giovanni Calanzone Automobile, Furgone Dante Alighieri Motocicletta Bill Gates Furgone Clint Eastwood Bicicletta, Furgone, Automobile Achille Lauro NULL
  • 34. TIPI TEMPORALI  I tipi temporali permettono di gestire date e orari  Tipi principali  DATE  DATETIME  TIMESTAMP  Tipi secondari  TIME  YEAR 22/04/2015 34 MatteoCeserani
  • 35. TIPI TEMPORALI  Tipo di dato DATE  Il formato per le date è il formato standard anglosassone  YYYY-MM-DD  Tipo di dato DATETIME  YYYY-MM-DD HH:mm:SS  Se si tenta di inserire una data non valida MySQL memorizza la data nulla  0000-00-00  0000-00-00 00:00:00 22/04/2015 35 MatteoCeserani
  • 36. TIPI TEMPORALI  Tipo di dato TIMESTAMP  Il tipo TIMESTAMP ha lo stesso formato di DATETIME ma si riferisce alla data UTC  UTC: Universal Coordinated Time  In sostanza è l’ora media di Greenwich (GMT - Greenwich Mean Time)  Quando si memorizza un valore in un campo TIMESTAMP il valore viene convertito dalla time zone locale a UTC  L’operazione inversa viene compiuta quando si recupera un valore attraverso una query  Il tutto in maniera trasparente all’utente  Inoltre MySQL supporta l’inserimento e l’aggiornamento automatico dei campi TIMESTAMP  Limitazione importante  Da 1970-01-01 00:00:00 a 2038-01-19 23:59:59 22/04/2015 36 MatteoCeserani
  • 37. CREAZIONE DI UNA RELAZIONE  Per creare le relazioni della base di dati Albergo occorre conoscere la realtà che la base di dati stessa deve modellare.  Caratteristiche dell’albergo  Caratteristiche del processo di gestione delle prenotazioni e dell’accoglienza  Più è approfondita tale conoscenza, maggiore sarà la qualità del risultato della progettazione  In questo contesto utilizzeremo un modello fortemente semplificato, per motivi didattici 22/04/2015 37 MatteoCeserani
  • 38. CREAZIONE DI UNA RELAZIONE Si tratta di un piccolo hotel in una località marittima, con le stanze distribuite su quattro piani; ci sono due stanze singole, due doppie, sette matrimoniali e due triple; tutte le stanze matrimoniali hanno la possibilità di aggiungere un terzo letto, e tre di queste, più grandi, possono ospitarne anche un quarto; anche le due stanze triple hanno la possibilità di aggiungere il quarto letto. Prevediamo anche alcune caratteristiche che diversificano le camere: alcune hanno un televisore, alcune hanno la vista sul mare, alcune hanno l’aria condizionata e, infine, alcune sono riservate ai fumatori. Tuttavia, come abbiamo detto prima, vogliamo semplificare un po’ le cose, per cui stabiliamo che queste caratteristiche non incidono sul prezzo della camera, che dipende invece esclusivamente dal periodo e dal numero di posti letto. Prevediamo anche un costo fisso, indipendente dalla stagione, per i letti aggiunti e per altri supplementi come la culla in camera; infine decidiamo che il trattamento standard fornito dal nostro hotel è la mezza pensione, per cui chiederemo un supplemento per la pensione completa e concederemo una riduzione per chi vuole solo bed & breakfast; anche queste differenze saranno indipendenti dal periodo stagionale. 22/04/2015 38 MatteoCeserani
  • 39. CREAZIONE DI UNA RELAZIONE 22/04/2015 39 MatteoCeserani -- Primi esempi di SQL DDL -- Creazione di un database CREATE DATABASE Hotel DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci; -- Selezione del database USE Hotel;  Il doppio trattino indica un commento  Dal doppio trattino in poi è tutto commento fino alla fine della riga
  • 40. CREAZIONE DI UNA RELAZIONE 22/04/2015 40 MatteoCeserani CREATE TABLE Camera( Numero SMALLINT UNSIGNED NOT NULL, Tipologia ENUM ('Doppia','Matrimoniale','Singola', 'Tripla') NOT NULL, Caratteristiche SET ('VM','AC','TV','Sm','La1', 'La2'), PRIMARY KEY (Numero) );  Qui c’è una novità:  PRIMARY KEY  Chiave Primaria
  • 41. CHIAVE PRIMARIA  Sottoinsieme degli attributi di una relazione che permette l'individuazione univoca dei record della relazione stessa.  In sostanza non possono esistere due record della relazione che possiedano gli stessi valori di chiave primaria.  Si intende che la chiave primaria può essere costituita da più di un attributo, ma dovrebbe essere scelta come un sottoinsieme MINIMO, cioè composto dal minor numero possibile di attributi.  Se si può si utilizza un attributo solo.  In una relazione possono esistere più possibilità di scelta della chiave primaria. In questo caso occorre fare una scelta. 22/04/2015 41 MatteoCeserani
  • 42. CHIAVE PRIMARIA  Esistono due sintassi per dichiarare una chiave primaria  PRIMARY KEY (<Campo1> [, <Campo2>]*)  Può essere sempre utilizzata  In genere viene posta dopo la dichiarazione di tutti i campi  <Campo> <Tipo> PRIMARY KEY  Può essere utilizzata se la chiave primaria è composta da un solo campo 22/04/2015 42 MatteoCeserani
  • 43. CHIAVE PRIMARIA  Un campo appartenente a una chiave primaria può assumere valori nulli  A rigor di logica però non è il caso di lasciare questa possibilità  Di solito si specifica sui campi chiave primaria il vincolo NOT NULL  Esiste inoltre la possibilità di specificare l’assenza di duplicati su un campo che non appartiene alla chiave primaria  Si utilizza l’attributo UNIQUE  Di fatto UNIQUE NOT NULL equivale a PRIMARY KEY NOT NULL 22/04/2015 43 MatteoCeserani
  • 44. CREAZIONE DI UNA RELAZIONE 22/04/2015 44 MatteoCeserani CREATE TABLE Cliente( Id SMALLINT UNSIGNED PRIMARY KEY NOT NULL AUTO_INCREMENT, Nome VARCHAR(100), Cognome VARCHAR(100) NOT NULL, DataN DATE, CF CHAR(16) UNIQUE, TipoD ENUM ('CI','P') NOT NULL, NumeroD VARCHAR(30) NOT NULL UNIQUE );
  • 45. INDICI 22/04/2015 45 MatteoCeserani  Insieme alle relazioni MySQL crea automaticamente alcuni INDICI (INDEX) collegati alla tabella  Di default crea un indice per i campi della chiave primaria e per tutti i campi per cui è espresso il vincolo UNIQUE
  • 46. INDICI  Quello degli indici è un meccanismo per rendere più veloce la ricerca di informazioni nella relazione  Si dice che alcuni campi della relazione vengono indicizzati  Quando un campo viene indicizzato il DBMS crea una o più tabelle aggiuntive collegate alla tabella principale e utilizzate dal DBMS in maniera trasparente all'utente per rendere più veloci le ricerche dei dati nel database 22/04/2015 46 MatteoCeserani
  • 47. INDICI  Per saperne di più  Un approfondimento (in inglese, ovviamente…)  Un esempio  Indice non denso su chiave primaria 22/04/2015 47 MatteoCeserani
  • 48. INDICI  Creazione di un indice  Sintassi CREATE INDEX <NomeIndice> ON <NomeRelazione> (<Campo1>[, <Campo2>]*);  Si possono creare indici composti con un massimo di 16 campi 22/04/2015 48 MatteoCeserani CREATE INDEX CognomeC ON Cliente (Cognome);
  • 49. INDICI  Le tabelle indice occupano memoria  Le tabelle indice devono essere aggiornate ogni volta che si inserisce o cancella un record in una relazione  Per questo motivo non si deve esagerare!  In linea di massima è bene indicizzare  Le chiavi primarie e i campi con vincolo UNIQUE  I campi sui quali si prevede di eseguire numerose ricerche  Per esempio: il campo Cognome nella relazione Cliente 22/04/2015 49 MatteoCeserani
  • 50. VINCOLI INTRARELAZIONALI  In generale è possibile specificare dei vincoli aggiuntivi per limitare l’insieme di valori che un campo può assumere.  Vincoli di tipo CHECK  Esistono due modi per inserirli  Al momento della creazione della relazione  A posteriori dopo aver creato la relazione 22/04/2015 50 MatteoCeserani ALTER TABLE Cliente ADD CONSTRAINT Nascita CHECK (DataN <= CURDATE()); CREATE TABLE Cliente( ... DataN DATE CHECK (DataN <= CURDATE()), CF CHAR(16) UNIQUE, ... CONSTRAINT Codice CHECK (CHAR_LENGHT(CF) = 16) );
  • 51. VINCOLI INTRARELAZIONALI  I vincoli CHECK sono comodissimi  Provandoli con MySQL però si ha una gradevole sorpresa  MySQL esegue correttamente le istruzioni SQL che contengono la parola chiave CHECK  Però poi non esegue i controlli sui vincoli stessi!  Dal manuale di MySQL  The CHECK clause is parsed but ignored by all storage engines  Cioè: MySQL legge i comandi con clausola CHECK senza segnalare errori ma poi ignora del tutto la clausola!  La domanda è: perché?  La risposta è un mistero 22/04/2015 51 MatteoCeserani
  • 52. VINCOLI INTRARELAZIONALI  Ma allora in MySQL come faccio?  Esempio  Per ora non approfondiamo  Utilizziamo però questo codice all’occorrenza 22/04/2015 52 MatteoCeserani DELIMITER // CREATE TRIGGER Nascita BEFORE INSERT ON Cliente FOR EACH ROW BEGIN DECLARE Messaggio varchar(255); IF (NEW.DataN > CURDATE()) THEN SET Messaggio = concat(‘Vincolo Nascita violato: DataN non può essere nel futuro!', NEW.DataN); SIGNAL sqlstate '45000' SET message_text = Messaggio; END IF; END // DELIMITER ;
  • 53. VINCOLI INTRARELAZIONALI  Altro esempio  Non è difficile  Occorre modificare la condizione di errore e il messaggio a seconda delle esigenze 22/04/2015 53 MatteoCeserani DELIMITER // CREATE TRIGGER Codice BEFORE INSERT ON Cliente FOR EACH ROW BEGIN DECLARE Messaggio varchar(255); IF NOT (CHAR_LENGHT(NEW.CF) = 16) THEN SET Messaggio = concat(‘Vincolo Codice violato: il codice fiscale deve avere lunghezza 16!'); SIGNAL sqlstate '45000' SET message_text = Messaggio; END IF; END // DELIMITER ;
  • 54. VINCOLI INTRARELAZIONALI  Con i trigger possiamo specificare vincoli più complessi  Per esempio vincoli che riguardano più campi nella stessa relazione  Per la sintassi dei trigger in generale fare riferimento al manuale di MySQL  http://dev.mysql.com/doc/refman/5.5/en/create- trigger.html 22/04/2015 54 MatteoCeserani
  • 55. CREAZIONE DI UNA RELAZIONE  In realtà per il vincolo CHECK dovrei usare un trigger 22/04/2015 55 MatteoCeserani CREATE TABLE Prenotazione( Id INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT, Cliente SMALLINT UNSIGNED NOT NULL, Camera SMALLINT UNSIGNED NOT NULL, DataA DATE NOT NULL, DataP DATE NOT NULL, CONSTRAINT DataAP CHECK (DataP > DataA), CONSTRAINT Duplicati UNIQUE KEY (Cliente, Camera, DataA) );
  • 56. CREAZIONE DI UNA RELAZIONE 22/04/2015 56 MatteoCeserani CREATE TABLE Prenotazione( Id INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT, Cliente SMALLINT UNSIGNED NOT NULL, Camera SMALLINT UNSIGNED NOT NULL, DataA DATE NOT NULL, DataP DATE NOT NULL, CONSTRAINT Duplicati UNIQUE KEY (Cliente, Camera, DataA) ); DELIMITER // CREATE TRIGGER CheckPren BEFORE INSERT ON Prenotazione FOR EACH ROW BEGIN DECLARE Messaggio varchar(255); IF (NEW.DataA >= NEW.DataP) THEN SET Messaggio = concat(‘Vincolo CheckPren violato!’); SIGNAL sqlstate '45000' SET message_text = Messaggio; END IF; END // DELIMITER ;
  • 57. CREAZIONE DI UNA RELAZIONE  Si noti come sia possibile definire il vincolo UNIQUE su un insieme di attributi della relazione  Il campo Cliente e il campo Camera non possono assumere valori qualsiasi  È ragionevole imporre che il numero identificativo del cliente sia già presente nella relazione Cliente  Stesso discorso occorre fare per il campo Camera  Diciamo che Prenotazione.Cliente si riferisce a Cliente.Id  Diciamo che Prenotazione.Camera si riferisce a Camera.Numero 22/04/2015 57 MatteoCeserani
  • 58. VINCOLI INTERRELAZIONALI  Quando un campo di una relazione deve riferirsi a un campo di un’altra relazione siamo in presenza di un vincolo interrelazionale  Questo tipo di vincolo prende il nome di chiave esterna (FOREIGN KEY)  Sintassi [CONSTRAINT <Nome>] FOREIGN KEY <Referente> REFERENCES <Riferito> [ON UPDATE <azione>] [ON DELETE <azione>] 22/04/2015 58 MatteoCeserani
  • 59. VINCOLI INTERRELAZIONALI  Inseriamo le chiavi esterne nella relazione Prenotazione 22/04/2015 59 MatteoCeserani CREATE TABLE Prenotazione( Id INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT, Cliente SMALLINT UNSIGNED NOT NULL, Camera SMALLINT UNSIGNED NOT NULL, DataA DATE NOT NULL, DataP DATE NOT NULL, CONSTRAINT Duplicati UNIQUE KEY (Cliente, Camera, DataA), CONSTRAINT FK_Cliente FOREIGN KEY Prenotazione (Cliente) REFERENCES Cliente (Id) ON UPDATE CASCADE ON DELETE RESTRICT, CONSTRAINT FK_Camera FOREIGN KEY Prenotazione (Camera) REFERENCES Camera (Numero) ON UPDATE CASCADE ON DELETE RESTRICT );
  • 60. VINCOLI INTERRELAZIONALI  Vincoli ON UPDATE e ON DELETE  Specificano quali azioni intraprendere sulla relazione quando un valore nel campo riferito viene modificato o cancellato  Valori possibili:  CASCADE  RESTRICT  SET NULL  NO ACTION 22/04/2015 60 MatteoCeserani
  • 61. VINCOLI INTERRELAZIONALI Azione Descrizione CASCADE Aggiorna o elimina tutti i record in cui è presente il valore riferito RESTRICT Non permettere l’operazione di aggiornamento o cancellazione nella relazione riferita SET NULL Assegna il valore null al campo referente in tutti i record in cui è presente il valore riferito NO ACTION Non fare nulla (in MySQL equivale a RESTRICT) 22/04/2015 61 MatteoCeserani  Se non si specifica alcuna clausola ON DELETE e/o ON UPDATE MySQL utilizza di default il valore RESTRICT
  • 62. VINCOLI INTERRELAZIONALI  È ovviamente possibile inserire a posteriori una chiave esterna in una relazione già creata  Si utilizza il comando ALTER  I campi coinvolti nelle chiavi esterne DEVONO essere indicizzati in entrambe le relazioni  Se un indice non è presente MySQL lo crea automaticamente 22/04/2015 62 MatteoCeserani ALTER TABLE Prenotazione ADD CONSTRAINT FK_Camera FOREIGN KEY Prenotazione (Camera) REFERENCES Camera (Numero) ON UPDATE CASCADE ON DELETE RESTRICT;
  • 63. MODIFICARE UNA RELAZIONE  Una tabella può essere modificata dopo essere stata creata utilizzando il comando ALTER TABLE  Sintassi:  ALTER TABLE <Nome-Relazione> <Specifica> [, <Specifica>]*  Le specifiche possono essere moltissime  Guardale tutte  MySQL 5.5 Reference Manual (Alter Table) 22/04/2015 63 MatteoCeserani
  • 64. MODIFICARE UNA RELAZIONE  Un esempio relativo alle prenotazioni  Una prenotazione richiede che si specifichi:  Il tipo di servizio  I letti aggiuntivi  L’eventuale culla in camera  Aggiungiamo i campi necessari 22/04/2015 64 MatteoCeserani ALTER TABLE Prenotazione ADD COLUMN Servizio ENUM("MP","PC","BB") NOT NULL DEFAULT "MP" AFTER DataP, ADD COLUMN Supplementi SET('LAg1','LAg2','Cu') AFTER Servizio;
  • 65. MODIFICARE UNA RELAZIONE  Altre possibilità utilizzate spesso  ALTER TABLE <Nome-Relazione> DROP COLUMN <Nome-Attributo>;  ALTER TABLE <Nome-Relazione> MODIFY COLUMN <Nome-Attributo> <Tipo- Attributo>;  ALTER TABLE <Nome-Relazione> RENAME TO <Nuovo-Nome>;  ALTER TABLE <Nome-Relazione> CHANGE COLUMN <Nome-Attributo> <Nuovo-Nome> <Tipo-Attributo>; 22/04/2015 65 MatteoCeserani
  • 66. MODIFICARE UNA RELAZIONE  Un altro esempio sulla relazione Cliente  Ci si può davvero sbizzarrire... 22/04/2015 66 MatteoCeserani ALTER TABLE Cliente ADD COLUMN Telefono VARCHAR(14), ADD COLUMN Email VARCHAR(100);
  • 67. ALTRE RELAZIONI DI SUPPORTO 22/04/2015 67 MatteoCeserani CREATE TABLE Prezzi ( Tipologia ENUM ('Doppia', 'Matrimoniale', 'Singola', 'Tripla') NOT NULL PRIMARY KEY, PrezzoA NUMERIC(6,2) NOT NULL, PrezzoB NUMERIC(6,2) NOT NULL ); CREATE TABLE Supplementi ( Tipo ENUM('LAg1','LAg2','Cu','P') NOT NULL PRIMARY KEY, Prezzo NUMERIC(6,2) NOT NULL );
  • 68. ALTRE RELAZIONI DI SUPPORTO 22/04/2015 68 MatteoCeserani DELIMITER // CREATE TRIGGER CheckPrezzi BEFORE INSERT ON Prezzi FOR EACH ROW BEGIN DECLARE Messaggio varchar(255); IF (NEW.PrezzoA <= 0 OR NEW.PrezzoB <= 0 OR NEW.PrezzoA < NEW.PrezzoB) THEN SET Messaggio = concat("Vincolo sui prezzi violato! Ricontrolla i valori."); SIGNAL sqlstate '45000' SET message_text = Messaggio; END IF; END // CREATE TRIGGER CheckPrezziSup BEFORE INSERT ON Supplementi FOR EACH ROW BEGIN DECLARE Messaggio varchar(255); IF (NEW.Prezzo < 0) THEN SET Messaggio = concat("Vincolo sui prezzi violato! Ricontrolla i valori."); SIGNAL sqlstate '45000' SET message_text = Messaggio; END IF; END // DELIMITER ;
  • 69. INSERIRE VALORI IN UNA RELAZIONE  MySQL permette l’inserimento di valori in una relazione in tre modi diversi  Di base si utilizza sempre l’istruzione INSERT in tre varianti differenti  INSERT ... VALUES  INSERT ... SET  INSERT ... SELECT 22/04/2015 69 MatteoCeserani
  • 70. INSERIRE VALORI IN UNA RELAZIONE  INSERT ... VALUES INSERT INTO <Nome-Relazione> [(<Attributo>[,<Attributo>]*)] {VALUES | VALUE} ({<Espressione> | DEFAULT},...) [,({<Espressione> | DEFAULT},...)]* [ON DUPLICATE KEY UPDATE <Attributo> = <Espressione> [,<Attributo> = <Espressione>]*] 22/04/2015 70 MatteoCeserani
  • 71. INSERIRE VALORI IN UNA RELAZIONE  Qualche esempio può chiarire meglio 22/04/2015 71 MatteoCeserani INSERT INTO Camera VALUES (101,"Singola","TV,AC,Sm"), (401,"Singola","VM,TV,AC"), (102,"Doppia","VM,TV,AC"), (402,"Doppia","TV,AC"), (103,"Tripla","La1,VM,TV,AC"), (203,"Tripla","La1,TV,AC"), (201,"Matrimoniale","La1,VM,TV,AC"), (202,"Matrimoniale","La1,TV,AC"), (301,"Matrimoniale","La1,VM,TV,AC"), (302,"Matrimoniale","La1,TV,AC"), (303,"Matrimoniale","La1,La2,VM,TV,AC"), (403,"Matrimoniale","La1,La2,VM,TV,AC"), (404,"Matrimoniale","La1,La2,VM,TV,AC");
  • 72. INSERIRE VALORI IN UNA RELAZIONE  I campi AUTO_INCREMENT supportano un meccanismo di generazione automatica delle chiavi  Nella INSERT si specifica il valore NULL  Viene di fatto utilizzato il primo valore che non è mai stato utilizzato in precedenza  Se invece si specifica un valore il sistema utilizza il valore specificato 22/04/2015 72 MatteoCeserani INSERT INTO Cliente VALUES (NULL,"Matteo", "Ceserani", "1975-08-27", "CSRMTT75M27F205C", "CI", "AN123456"), (NULL,"Mattia", "Cipriani", "1996-01-07", "CPRMTT96A07E202C", "CI", "FG654321");
  • 73. INSERIRE VALORI IN UNA RELAZIONE  Una INSERT può determinare una violazione di un vincolo PRIMARY KEY oppure FOREIGN KEY  In questi casi è utile ricorrere al costrutto ON DUPLICATE KEY UPDATE  Se il sistema constata la violazione di un vincolo di unicità aggiorna gli attributi necessari prima di eseguire la INSERT  In generale però si consiglia di non usare questo costrutto nel caso in cui una tabella contenga più campi con vincolo UNIQUE 22/04/2015 73 MatteoCeserani INSERT INTO Cliente VALUES (1,"Matteo","Ceserani","1975-08-27", "CSRMTT75M27F205C", "CI", "AN123456") ON DUPLICATE KEY UPDATE Id = LAST_INSERT_ID() + 1;
  • 74. INSERIRE VALORI IN UNA RELAZIONE  Attenzione però  La funzione LAST_INSERT_ID() restituisce l’ultimo valore inserito attraverso una INSERT in un campo AUTO_INCREMENT  Non si può però specificare la relazione in cui il record è stato inserito!  Viene restituito sempre l’ultimo valore AUTO_INCREMENT generato nella base di dati, a prescindere dalla relazione  La INSERT della slide precedente funziona con certezza solo se l’ultima INSERT eseguita si riferiva alla relazione Cliente 22/04/2015 74 MatteoCeserani
  • 75. INSERIRE VALORI IN UNA RELAZIONE  È possibile specificare nella INSERT solo un sottoinsieme degli attributi della relazione  Es.  Per i campi non indicati tra le parentesi vengono utilizzati i valori di DEFAULT, se indicati, oppure il valore NULL  Nel caso di ENUM il valore di DEFAULT è il primo riportato nella definizione della relazione  Nel caso di SET invece se non è indicato, il valore di DEFAULT è NULL 22/04/2015 75 MatteoCeserani INSERT INTO Cliente(Nome,Cognome,TipoD,NumeroD) VALUES ("Massimiliano","Bianchi","CI","AB123456");
  • 76. INSERIRE VALORI IN UNA RELAZIONE  INSERT ... SET  Questo tipo di INSERT può essere utilizzato in alternativa al più comune INSERT … VALUES  Si tratta però di dialetto MySQL, non di SQL standard  Es. equivale a 22/04/2015 76 MatteoCeserani INSERT INTO Cliente(Nome,Cognome,NumeroD) VALUES ("Massimiliano","Bianchi","AB123457"); INSERT INTO Cliente SET Nome = "Massimiliano", Cognome = "Bianchi", NumeroD = "AB123457";
  • 77. INSERIRE VALORI IN UNA RELAZIONE  INSERT ... SELECT  Il costrutto INSERT ... SELECT permette di inserire in una tabella valori ottenuti da una o più altre tabelle  Es. 22/04/2015 77 MatteoCeserani CREATE TABLE ClienteP( Id SMALLINT UNSIGNED PRIMARY KEY NOT NULL AUTO_INCREMENT, Nome VARCHAR(100), Cognome VARCHAR(100) NOT NULL, DataN DATE, NumeroD VARCHAR(30) NOT NULL UNIQUE, Telefono VARCHAR(14), Email VARCHAR(100) ); INSERT INTO ClienteP SELECT Cliente.Id, Cliente.Nome, Cliente.Cognome, Cliente.DataN, Cliente.NumeroD, Cliente.Telefono, Cliente.Email FROM Cliente WHERE Cliente.TipoD = "P";
  • 78. ELIMINARE VALORI DA UNA RELAZIONE  DELETE  Sintassi DELETE FROM <tbl_name> [WHERE <where_condition>] [LIMIT <row_count>];  Es. 22/04/2015 78 MatteoCeserani DELETE FROM Cliente WHERE Cognome = "Massimiliano" LIMIT 1;
  • 79. ELIMINARE RELAZIONI, VINCOLI E DATABASE  DROP  DROP DATABASE  DROP TABLE  DROP INDEX  DROP TRIGGER  Da usare con grande attenzione! 22/04/2015 79 MatteoCeserani
  • 80. STORAGE ENGINES  Uno storage engine è lo strato software che in un DBMS si occupa di effettuare le operazioni CRUD sui database  Create  Read  Update  Delete  Di per sé si può vivere bene senza preoccuparsi troppo dello storage engine che un DBMS sta utilizzando 22/04/2015 80 MatteoCeserani
  • 81. STORAGE ENGINES  Molti DBMS supportano diversi tipi di storage engines  MySQL  InnoDB  MyISAM  Memory  Merge  Archive  Federated  NDB  CSV  Blackhole  Example 22/04/2015 81 MatteoCeserani
  • 82. STORAGE ENGINES  Confronto tra diversi storage engines 22/04/2015 82 MatteoCeserani Feature MyISAM Memory InnoDB Archive NDB Storage limits 256TB RAM 64TB None 384EB Transactions No No Yes No Yes Locking granularity Table Table Row Table Row MVCC No No Yes No No Geospatial data type support Yes No Yes Yes Yes Geospatial indexing support Yes No No No No B-tree indexes Yes Yes Yes No No T-tree indexes No No No No Yes Hash indexes No Yes No No Yes Full-text search indexes Yes No Yes No No Clustered indexes No No Yes No No Data caches No N/A Yes No Yes Index caches Yes N/A Yes No Yes Compressed data Yes No Yes Yes No Encrypted data Yes Yes Yes Yes Yes Cluster database support No No No No Yes Replication support Yes Yes Yes Yes Yes Foreign key support No No Yes No No Backup / point-in-time recovery Yes Yes Yes Yes Yes Query cache support Yes Yes Yes Yes Yes Update statistics for data dictionary Yes Yes Yes Yes Yes
  • 83. STORAGE ENGINES  Come impostare uno storage engine 22/04/2015 83 MatteoCeserani CREATE TABLE ClienteP( Id SMALLINT UNSIGNED PRIMARY KEY NOT NULL AUTO_INCREMENT, Nome VARCHAR(100), Cognome VARCHAR(100) NOT NULL, DataN DATE, NumeroD VARCHAR(30) NOT NULL UNIQUE, Telefono VARCHAR(14), Email VARCHAR(100) ) Engine = InnoDB;