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 1
Creazione di un database http://smartlab.ws • Il comando MySQL è semplice ed intuitivo • CREATE DATABASE mio_db; • Ricordatevi sempre il ‘;’ al termine delle espressioni 2
Creazione 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 3
CREATE TABLE http://smartlab.ws CREATE TABLE nome_tabella ( attributo1 [caratteristiche] [vincoli] { , attributon [caratteristiche] [vincoli]} {EventualiAltriVincoli} ); 4
CREATE 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 5
CREATE 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) 6
CREATE 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 7
CREATE 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 8
CREATE 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 9
CREATE 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 10
CREATE 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 11
CREATE 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 € 12
CREATE 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 -> ); 13
CREATE 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: 14
CREATE 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) -> ); 15
Modifiche 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 16
ALTER 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 > >; 17
ALTER 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 18
ALTER TABLE - Esempio http://smartlab.ws Aggiungiamo il campo CAPResidenza alla tabella anagrafica: ALTER TABLE anagrafica ADD COLUMN CAPResidenza INT NOT NULL; 19
ALTER 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; 21
ALTER 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; 22
Cancellazione 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 23
DROP 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) 24
Costrutti 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 25
Prima 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) -> ); 26
Notate 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 27
FOREIGN 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 28
FOREIGN 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) -> ); 29
C’è 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? 30
FOREIGN 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 31
FOREIGN KEY http://smartlab.ws FOREIGN KEY (campi_referenzianti) REFERENCES tabella [(campi_referenziati)] [ON UPDATE ] [ON DELETE ] 32
FOREIGN 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. 33
Tabella 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 34
FOREIGN 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 ); 35
Alcune 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 36
Dump 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) 37
Dump 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 38
E 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 39
E per salvare le istruzioni scritte? http://smartlab.ws 40
E per salvare le istruzioni scritte? http://smartlab.ws 41
Puoi anche leggere