SQL - Data Definition Language (DDL) - Dr. Alessandro Ghio
←
→
Trascrizione del contenuto della pagina
Se il tuo browser non visualizza correttamente la pagina, ti preghiamo di leggere il contenuto della pagina quaggiù
SmartLab - DITEN - Università di Genova
http://smartlab.ws
SQL - Data Definition Language (DDL)
Dr. Alessandro Ghio
Alessandro.Ghio@smartlab.ws
1Creazione di un database http://smartlab.ws
• Il comando MySQL è semplice ed intuitivo
• CREATE DATABASE mio_db;
• Ricordatevi sempre il ‘;’ al termine delle espressioni
2Creazione di una tabella http://smartlab.ws
• Si utilizza il costrutto CREATE TABLE
• Permette di definire
• Lo schema della tabella
• Eventuali chiavi
• Vincoli di integrità sui dati contenuti nella tabella
3CREATE TABLE http://smartlab.ws
CREATE TABLE nome_tabella (
attributo1 [caratteristiche] [vincoli]
{ , attributon [caratteristiche] [vincoli]}
{EventualiAltriVincoli}
);
4CREATE TABLE http://smartlab.ws
Tipi di dato (elenchiamo solo i principali, per una lista completa far riferimento alla
guida http://dev.mysql.com/doc/refman/5.0/en//data-type-overview.html)
BIT[(m)]: tipo bit, m è la lunghezza, m=1 valore di default
BOOLEAN: valori true o false, dove false equivale a 0 e true a qualsiasi numero tra 1
(tipicamente) e 9
INT[(m)] [UNSIGNED] [ZEROFILL]: indica un intero a 32 bit. m rappresenta la lunghezza
massima di visualizzazione (attenzione, non di rappresentazione) del numero. Il campo
facoltativo UNSIGNED indica che il valore inserito non ha segno (amplia il range nel
campo dei numeri positivi). ZEROFILL indica che i valori verranno salvati nel DB
sempre sotto forma di m valori, tutti uguali a 0 se non diversamente indicato
5CREATE TABLE http://smartlab.ws
Tipi di dato (elenchiamo solo i principali, per una lista completa far riferimento
alla guida http://dev.mysql.com/doc/refman/5.0/en//data-type-overview.html)
DECIMAL(p,s): utilizzati per i numeri decimali, dove p è la precisione (ovvero il
numero totale di cifre utilizzate per la rappresentazione) e s è la scala (il
numero di cifre dopo la virgola)
REAL: indica un campo contenente valori reali a singola precisione (32 bit)
DOUBLE PRECISION: indica un campo contenente valori reali a doppia
precisione (64 bit)
6CREATE TABLE http://smartlab.ws
Tipi di dato (elenchiamo solo i principali, per una lista completa far riferimento alla guida http://
dev.mysql.com/doc/refman/5.0/en//data-type-overview.html)
TIMESTAMP[(p)]: utilizzato per includere il time stamp attuale di inserimento del dato in una tabella,
con una precisione definita dal campo opzionale p, salvato sotto forma di numero di secondi
trascorsi dal 1/1/1970
DATETIME: utilizzato per salvare date - è vincolato a date successive al 1/1/1000 e precedenti il
31/12/9999. Se non si è interessati all’informazione sull’ora, si può optare per DATE
CHAR(m) / VARCHAR(m): indica un campo stringa testuale, dove m indica la lunghezza massima (m
al massimo può assumere valore 255). VARCHAR è un campo di larghezza variabile, mentre CHAR
indica un campo fisso (qualora la stringa inserita sia più breve, include degli spazi alla fine)
ENUM(valori): indica un campo che può assumere solo un set limitato di valori, elencati fra parentesi
7CREATE TABLE http://smartlab.ws
Vincoli (elenchiamo solo i principali, per una lista completa far riferimento alla
guida http://dev.mysql.com/doc/refman/5.0/en//data-type-overview.html)
NOT NULL: il campo non può contenere valori null (es. una chiave primaria).
Di default, NOT NULL dovrebbe essere settato automaticamente a true per le
chiavi primarie: spesso si preferisce, per consuetudine, non rischiare
PRIMARY KEY: il campo in questione è la chiave primaria della tabella
AUTO_INCREMENT: definisce un campo auto incrementale
8CREATE TABLE http://smartlab.ws
Vincoli (elenchiamo solo i principali, per una lista completa far riferimento alla
guida http://dev.mysql.com/doc/refman/5.0/en//data-type-overview.html)
DEFAULT valore: indica il valore di default che assume il campo in caso non
sia indicato diversamente dall’utente
UNIQUE: indica che un attributo o un insieme di attributi non possono
assumere gli stessi valori in entry diverse. Ammette la ripetizione del NULL
(quindi non implica NOT NULL)
CHECK (condizione): verifica che il campo rispetti una o più condizioni
necessarie
9CREATE TABLE - Esempio pratico http://smartlab.ws
• Creiamo un DB che nominiamo esercizio1
• CREATE DATABASE esercizio1;
• Aggiungiamo una tabella di anagrafica contenente:
• un campo codice fiscale, per un totale di 16 caratteri che
rappresenteranno la nostra chiave primaria
• un campo cognome e un campo nome
• un campo per la data di nascita
10CREATE TABLE - Esempio pratico http://smartlab.ws
mysql> CREATE DATABASE esercizio1;
Query OK, 1 row affected (0.00 sec)
mysql> USE esercizio1;
Database changed
mysql> CREATE TABLE anagrafica (
-> CodiceFiscale CHAR(16) NOT NULL PRIMARY KEY,
-> Cognome VARCHAR(100) NOT NULL,
-> Nome VARCHAR(100) NOT NULL,
-> DataNascita DATE,
-> OraCreazione TIMESTAMP
-> );
Per verificare che sia tutto ok, potete lanciare la descrizione della tabella appena creata con DESC anagrafica
11CREATE TABLE - Esempio pratico http://smartlab.ws
• Vogliamo ora creare una seconda tabella per i prodotti, contenente
• un ID del prodotto
• il nome del prodotto
• la quantità di prodotto in magazzino
• il costo unitario del prodotto, in euro e supponendo che il costo massimo
unitario di un prodotto a magazzino non superi mai i 9999.99 €
12CREATE TABLE - Esempio pratico http://smartlab.ws
mysql> CREATE TABLE prodotti (
-> IdProdotto INT UNSIGNED NOT NULL PRIMARY KEY,
-> Nome VARCHAR(100) NOT NULL,
-> QtaMagazzino INT NOT NULL CHECK(QtaMagazzino >= 0),
-> CostoUnitario DECIMAL(6,2) DEFAULT 0.0
-> );
13CREATE TABLE - Esempio pratico http://smartlab.ws
• Alcuni vincoli possono essere elencati in coda alla lista di campi per una
tabella per indicare che solo combinazioni di questi campi vanno a
rappresentare una chiave o solo una combinazione di valori per questi
campi può essere unica
• È il caso di PRIMARY KEY e UNIQUE
• La definizione della tabella prodotti diventerebbe quindi:
14CREATE TABLE - Esempio pratico http://smartlab.ws
mysql> CREATE TABLE prodotti (
-> IdProdotto INT UNSIGNED NOT NULL,
-> Nome VARCHAR(100) NOT NULL,
-> QtaMagazzino INT NOT NULL CHECK(QtaMagazzino >= 0),
-> CostoUnitario DECIMAL(6,2) DEFAULT 0.0,
-> PRIMARY KEY (IdProdotto)
-> );
15Modifiche allo schema di una tabella http://smartlab.ws
• È possibile attraverso il costrutto ALTER TABLE, che contempla le seguenti
operazioni:
• aggiunta di un nuovo campo
• definizione di un nuovo valore di default per un campo
• eliminazione di un campo esistente
• definizione di un nuovo vincolo di integrità
• eliminazione di un vincolo esistente
16ALTER TABLE http://smartlab.ws
ALTER TABLE tabella
< ADD COLUMN |
MODIFY COLUMN campo < NuovaDefinizione > |
ALTER COLUMN campo < SET | DROP DEFAULT> |
DROP COLUMN campo < CASCADE | RESTRICT > |
ADD CONSTRAINT [vincolo] < DefinizioneUnique > | < DefinizioneKey > | < DefinizioneCheck > |
DROP CONSTRAINT [vincolo] < CASCADE | RESTRICT >
>;
17ALTER TABLE http://smartlab.ws
• RESTRICT
• l’elemento (campo o vincolo che sia) non viene eliminato se referenziato
da una definizione di un qualche altro elemento
• Opzione di default
• CASCADE
• tutti gli elementi che dipendono da un elemento rimosso vengono rimossi,
fino a quando non esistono più dipendenze non risolte
18ALTER TABLE - Esempio http://smartlab.ws
Aggiungiamo il campo CAPResidenza alla tabella anagrafica:
ALTER TABLE anagrafica
ADD COLUMN CAPResidenza INT NOT NULL;
19ALTER TABLE - Esempio http://smartlab.ws La soluzione adottata non è particolarmente brillante, in quanto il CAP può assumere solo valori a 5 cifre; ci piacerebbe che per CAP brevi ci fosse attiva l’opzione ZEROFILL per colmare gli spazi rimanenti con dei valori a 0 mysql> ALTER TABLE anagrafica MODIFY COLUMN CAPResidenza INT(5) UNSIGNED ZEROFILL; mysql> ALTER TABLE anagrafica ADD CONSTRAINT CAPResidenza CHECK(CAPResidenza
ALTER TABLE - Esempio http://smartlab.ws
Vogliamo ora aggiungere alla colonna CAPResidenza il valore di default 0:
mysql> ALTER TABLE anagrafica ALTER COLUMN CAPResidenza SET
DEFAULT 0;
21ALTER TABLE - Esempio http://smartlab.ws
Vogliamo ora cancellare la colonna CAPResidenza dalla tabella, forzandone
la propagazione a tutte le altre tabelle connesse (in questo caso, nessuna):
ALTER TABLE anagrafica DROP COLUMN CAPResidenza CASCADE;
22Cancellazione di una tabella http://smartlab.ws
• È possibile cancellare una tabella intera (e con essa il suo contenuto) mediante il
seguente comando
• DROP TABLE nome_tabella [RESTRICT | CASCADE];
• Analogamente a quanto visto in precedenza, RESTRICT consente l’eliminazione solo
se la tabella non è presente nelle definizioni di altre relazioni (anche derivate, come p.e.
le viste che dovreste conoscere e che comunque analizzeremo nuovamente più avanti)
• RESTRICT è l’opzione attiva per default
• Mediante il comando CASCADE, invece, l’eliminazione viene forzata a prescindere
dalle dipendenze
23DROP TABLE - Esempio http://smartlab.ws
• Creiamo una tabella fittizia prova, contenente un ID e un timestamp:
• mysql> CREATE TABLE prova (
• -> ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
• -> TS TIMESTAMP);
• ...e cancelliamola, lasciando l’opzione di default
• mysql> DROP TABLE prova;
• ATTENZIONE: se avete tabelle con nomi simili, attenzione a digitare correttamente il nome:
MySQL non chiede conferma dell’operazione, che è irreversibile (a meno che non abbiate
impostato opzioni di backup avanzate, che non vedremo in questo insegnamento)
24Costrutti avanzati http://smartlab.ws
• Ricapitoliamo: nel DB esercizio1 al momento sono presenti 2 tabelle:
• anagrafica, con chiave primaria il codice fiscale del cliente
• prodotti, con chiave primaria l’ID del prodotto.
• Creiamo una nuova tabella, chiamata vendite, in cui abbiamo:
• un ID della vendita
• il CF del cliente
• il codice del prodotto acquistato
• la quantità di prodotto acquistata
• Supponiamo che la tabella non abbia chiave primaria, almeno per il momento
25Prima soluzione http://smartlab.ws
mysql> CREATE TABLE vendite (
-> CodVendita VARCHAR(5) NOT NULL,
-> CFCliente CHAR(16) NOT NULL,
-> IdProdotto INT UNSIGNED NOT NULL,
-> Quantita INT UNSIGNED NOT NULL DEFAULT 1 CHECK(Quantita > 0)
-> );
26Notate bene... http://smartlab.ws
• Alcuni dei campi di questa tabella sono chiavi di altre tabelle
• CFCliente
• IdProdotto
• Sono di fatto chiavi esterne di altre tabelle
• Per garantire consistenza, è necessario creare un “link” tra questi campi,
così da poter anche intraprendere azioni coordinate di cancellazione e/o
modifica di entry, qualora necessario
27FOREIGN KEY http://smartlab.ws
• Utilizziamo a questo scopo il costrutto
• FOREIGN KEY (elenco_campi_referenzianti) REFERENCES tabella
[(elenco_campi_referenziati)]
• Cancelliamo la tabella creata in precedenza e ricreiamola con questo
costrutto
28FOREIGN KEY http://smartlab.ws
mysql> CREATE TABLE vendite (
-> CodVendita VARCHAR(5) NOT NULL,
-> CFCliente CHAR(16) NOT NULL,
-> IdProdotto INT UNSIGNED NOT NULL,
-> Quantita INT UNSIGNED NOT NULL DEFAULT 1 CHECK(Quantita > 0),
-> FOREIGN KEY (CFCliente) REFERENCES anagrafica(CodiceFiscale),
-> FOREIGN KEY (IdProdotto) REFERENCES prodotti(IdProdotto)
-> );
29C’è ancora un piccolo problema... http://smartlab.ws
• Supponiamo ora che voi abbiate incluso alcune entry nel vostro DB
• Per esempio, avete incluso un cliente con CF ABCDEF12A34B567C, per il
quale non vi risultano, ad una prima analisi, vendite nel DB
• Questo cliente non è probabilmente più attivo da ormai alcuni anni, e volete
cancellarlo dal DB
• Volete tuttavia essere sicuri, prima di eliminare entry, che effettivamente
non vi sia sfuggita alcuna vendita
• Come fare?
30FOREIGN KEY http://smartlab.ws
• Il costrutto FOREIGN KEY è in verità più complesso di quanto visto in
precedenza
• Esso contempla anche diverse opzioni per le azioni da eseguire in caso di
• UPDATE di entry nella tabella di entry referenziata (es. aggiornamento del
codice fiscale, se era stato inserito in modo errato)
• DELETE di entry nella tabella di entry referenziata
31FOREIGN KEY http://smartlab.ws
FOREIGN KEY (campi_referenzianti)
REFERENCES tabella [(campi_referenziati)]
[ON UPDATE ]
[ON DELETE ]
32FOREIGN KEY http://smartlab.ws
• Sostanzialmente, avete 4 scelte possibili in caso di azione sulla tabella
referenziata:
• CASCADE: l’azione sulla tabella referenziata si ripercuote direttamente sulla
tabella referenziante. È l’opzione di default.
• SET NULL: in caso di modifica o cancellazione, si setta il valore della entry
corrispondente a NULL
• SET DEFAULT: in caso di modifica o cancellazione, si setta il valore della entry
corrispondente al valore di default, se definito
• NO ACTION: l’azione sulla tabella referenziata viene bloccata e non consentita.
33Tabella precedente... http://smartlab.ws
• Cancelliamo nuovamente la tabella e ricreiamola con i nuovi vincoli
• Per esempio, supponiamo che in caso di update vogliate applicare
un’operazione di tipo CASCADE
• Come detto, invece, non volete che in caso di DELETE l’operazione si
ripercuota sulla vostra tabella se vi sono vendite riferite a quel cliente
• Per esempio, optiamo per un NO ACTION
• Supponiamo di voler agire nello stesso modo nei confronti della tabella
prodotti
34FOREIGN KEY http://smartlab.ws
mysql> CREATE TABLE vendite (
-> CodVendita VARCHAR(5) NOT NULL,
-> CFCliente CHAR(16) NOT NULL,
-> IdProdotto INT UNSIGNED NOT NULL,
-> Quantita INT UNSIGNED NOT NULL DEFAULT 1 CHECK(Quantita > 0),
-> FOREIGN KEY (CFCliente) REFERENCES anagrafica(CodiceFiscale)
-> ON UPDATE CASCADE
-> ON DELETE NO ACTION,
-> FOREIGN KEY (IdProdotto) REFERENCES prodotti(IdProdotto)
-> ON UPDATE CASCADE
-> ON DELETE NO ACTION );
35Alcune funzionalità utili di MySQL http://smartlab.ws
• Talvolta è utile poter effettuare delle copie “esportabili” del proprio DB
• Quello che dovete fare non è niente altro che un dump del vostro DB
• A questo scopo, MySQL è dotato di un motore molto potente per l’esportazione (e la
seguente importazione) di basi di dati
• Supponiamo di voler esportare il DB esercizio1 su file, e di volerlo re-importare su
un’altra istanza di MySQL (p.e. esportate il DB dal PC del laboratorio e volete ritrovare i
vostri lavori sul PC di casa)
• Notate che MySQL rappresenta uno strato software che “isola” dal sistema operativo
sottostante: ciò significa che potete lavorare in lab con Windows e utilizzare i risultati
su un MySQL compatibile a casa, magari installato su Ubuntu
36Dump di un DB http://smartlab.ws
• Per prima cosa, dobbiamo uscire da MySQL
• È sufficiente digitare exit;
• A questo punto, è sufficiente digitare:
• mysqldump -u root [nome_db] > [Percorso completo per il file
+nome_file].sql
• Es.: mysqldump -u root esercizio1 > /Users/alessandroghio/Desktop/
dump.sql (è un percorso per Mac OS)
37Dump di un DB http://smartlab.ws
• Per importare il DB:
• entrare in MySQL
• se non presente, creare un nuovo DB, e il nome può anche essere diverso da
esercizio1 - per esempio chiamiamolo provadump
• uscire da MySQL - ATTENZIONE: non sospendere il servizio DBMS MySQL
• digitare
• mysql -u root [nome_db] < [Percorso completo file+nome_file].sql
• Es. (in Win): mysql -u root provadump < Z:\Desktop\dump.sql
38E per salvare le istruzioni scritte? http://smartlab.ws
• Il motore MySQL consente di eseguire istruzioni incluse dentro file
“sorgenti”
• Non sono altro che semplici file testuali, salvabili in formato txt ASCII
standard
• Supponiamo di voler aggiungere nuovamente la tabella fittizia presentata
alcune slide fa
• Creiamo un file di testo con un qualsiasi editor (es. notepad per Windows,
TextWrangler per Mac OS, gEdit per Linux) e scriviamo all’interno
l’istruzione
39E per salvare le istruzioni scritte? http://smartlab.ws
40E per salvare le istruzioni scritte? http://smartlab.ws
41Puoi anche leggere