SQL - Data Definition Language (DDL) - Dr. Alessandro Ghio

Pagina creata da Lisa Costanzo
 
CONTINUA A LEGGERE
SQL - Data Definition Language (DDL) - Dr. Alessandro Ghio
SmartLab - DITEN - Università di Genova
                 http://smartlab.ws

SQL - Data Definition Language (DDL)
             Dr. Alessandro Ghio

         Alessandro.Ghio@smartlab.ws

                                                 1
SQL - Data Definition Language (DDL) - Dr. Alessandro Ghio
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
SQL - Data Definition Language (DDL) - Dr. Alessandro Ghio
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
SQL - Data Definition Language (DDL) - Dr. Alessandro Ghio
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