I comandi Linux: MySQL ( 5 ) | ALTRI capitoli | ||
Il primo vincolo da impostare in una tabella ben organizzata è il tipo di dato che una colonna può contenere. Meglio è definito il tipo di dato che una cella può accettare, minori saranno i rischi di inserimento di un dato non congruo. Vediamo i principali tipi di dato:
dove M indica il massimo numero di cifre da visualizzare. Questo valore non ha nulla a che fare con l'intervallo numerico che il tipo di dato può supportare. Per i tipi di dato floating-point e fixed-point, M rappresenta il numero totale di cifre che possono essere memorizzate ( la precisione ). Per le stringhe testuali, M rappresenta la lunghezza massima.
dove M indica il massimo numero di cifre di cui deve essere composto l'intero numero ( precisione ), mentre D rappresenta il massimo numero di cifre per la parte decimale ( scale, ). Per esempio:
permette di utilizzare un massimo di 5 cifre totali, di cui 2 decimali, potendo, così, rappresentare l'intervallo numerico compreso tra -999,99 a 999,99.
La frazione 0 indica che non si desidera alcuna indicazione delle frazioni di secondo che seguono, mentre la frazione 6 indica che si desidera vedere espresse le frazioni di secondo con una precisione composta da 6 cifre.
La prima domanda che può sorgere spontanea è: che differenza c'è tra DATETIME e TIMESTAMP? La prima differenza che salta subito all'occhio è l'intervallo temporale supportato dai due differenti formati. Un'altra differenza molto importante è direttamente connessa alle modalità di memorizzazione delle date, da parte del motore MySQL: "MySQL, per memorizzare le date, converte i valori TIMESTAMP dal fuso orario corrente a UTC e, quando recupera le informazioni dal database, da UTC all'orario del fuso orario corrente. Questo non accade per altri formati di data, quali DATE o DATETIME. Di default, quando si parla del fuso orario corrente, si intende indicare il fuso orario del server" ( MySQL 5.7 Reference Manual: The DATE, DATETIME, and TIMESTAMP Types ). Quindi, se l'applicazione che interroga il database ha bisogno di un valore assoluto, rispetto a GMT ( Greenwich Mean Time ), la scelta deve cadere su TIMESTAMP, che memorizzerà le date del server. Se, invece, l'applicazione avesse bisogno degli orari locali rispetto all'utente ( e non al server ), allora la scelta dovrebbe cadere su DATETIME. Inoltre, mentre DATETIME memorizza una data ed un orario come data ed orario, TIMESTAMP li memorizza come numero di secondi trascorsi da un momento iniziale definito nel tempo, chiamato EPOCH, che corrisponde alla data:
vale a dire, primo gennaio 1970.
Le ore possono essere maggiori di 24, perchè il tipo di dato TIME può essere usato non solo per indicare un orario nel corso di una gionata, ma anche un intervallo temporale tra due eventi.
L'anno può essere espresso in quattro formati differenti:
dove L rappresenta la lunghezza dei dati da memorizzare, mentre i byte aggiuntivi vengono usati per memorizzare la lunghezza della stringa. I tipi di dato TINYTEXT, TEXT, MEDIUMTEXT, LONGTEXT, corrispondono ai quatro tipi di dato BLOB, solo che i tipi BLOB vengono trattati come dati binari, senza CHARSET, per i quali le operazioni di confronto e di ordinamento vengono effettuate sui valori numerici dei byte, mentre i tipi di dato TEXT hanno un CHARSET e le operazioni di confronto e di ordinamento vengono effettuate in base alle regole di collazione. In fase di creazione di una tabella MySQL, è possibile assegnare, a ciascuna colonna, una serie di vincoli:
Il primo vincolo chiede a MySQL di respingere il valore NULL per la colonna alla quale è associato, dove NULL è un valore mancante o un valore sconosciuto. Zero e una stringa vuota non sono valori NULL. Il vincolo di unicità chiede a MySQL di verificare, per il campo ( colonna ) al quale il vincolo è associato, se il valore immesso sia già presente nello stesso campo di un record differente della tabella. In questo caso, il dato dovrà essere respinto. Un campo UNIQUE, in MySQL, può contenere un valore NULL, una chiave primaria no. Una chiave primaria è, automaticamente, etichettata come UNIQUE.
Il vincolo SQL CHECK viene ignorato da MySQL, qualsiasi motore si usi. Viene mantenuto esclusivamente per motivi di compatibilità, ma non viene eseguito. Per aggirare il problema, è possibile utilizzare il comando:
Il vincolo di riferimento ( REFERENCES ) è disponibile solo per il motore MySQL InnoDB. Per sapere quale motore MySQL state utilizzando, eseguite il comando:
Il motore MySQL da utilizzare viene specificato al momento della creazione di ciascuna tabella:
Il motore MySQL da utilizzare di default può essere impostato in uno dei file di configurazione, all'interno della sezione dedicata al server MySQL:
Il vincolo di riferimento ( REFERENCES ) collega due tabelle, attraverso un campo della tabella referente, il campo FOREIGN KEY, che rimanda al campo PRIMARY KEY della tabella referenziata. La relazione creata con il campo FOREIGN KEY definisce una tabella PARENT ( tabella referenziata ) ed una tabella CHILD ( tabella referente ). La clausola FOREIGN KEY è contenuta nella tabella CHILD:
La colonna della tabella referente deve contenere lo stesso tipo di dato contenuto nella colonna della tabella referenziata. Una chiave esterna ( FOREIGN KEY ) dovrebbe fare riferimento alla chiave primaria della tabella referenziata, ma SQL consente di referenziare anche colonne con un vincolo UNIQUE. Se la tabella referenziata ha una chiave primaria composta da più campi, la chiave esterna della tabella referente potrà essere, anch'essa, composta da più campi:
Un vincolo di riferimento garantisce la cosiddetta integrità referenziale, che fa si che MySQL respinga tutte le query ( comandi SQL, quali UPDATE o INSERT ) in cui si chieda di inserire, nella colonna FOREIGN KEY della tabella CHILD ( referente ), un valore che non sia presente nella colonna PRIMARY KEY della tabella PARENT ( referenziata ). Nel caso il valore di un campo presente nella colonna PRIMARY KEY della tabella PARENT ( referenziata ) venisse modificato ( UPDATE ) o nel caso venisse cancellato l'intero record di appartenenza ( DELETE ), è possibile specificare un'azione da eseguire sul corrispondente campo ( FOREIGN KEY ) o record della tabella referente ( CHILD ):
MySQL permette anche la creazione di un campo FOREIGN KEY in una tabella, che rimandi ad un campo UNIQUE o PRIMARY KEY della stessa tabella. In questo caso, le tabelle PARENT e CHILD coincidono. Ad un vincolo di riferimento deve essere assegnato un nome: se non lo facciamo noi, lo farà MySQL:
In questo esempio, stiamo eseguendo un CREATE TABLE per la tabella "Inventory":
e stiamo definendo un vincolo referenziale, chiamato "chiave_esterna", per il quale alla colonna:
vengono assegnati il compito di chiave esterna ( FOREIGN KEY ) ed uno dei valori contenuti nel campo corrispondente di un record qualsiasi della tabella referenziata:
dicendo a MySQL che, quando verrà modificato il valore del campo:
dovrà cambiare, a cascata ( CASCADE ), anche il valore del campo:
e che quando verrà eliminato un record della tabella referenziata, dovrà, a cascata, essere eliminato il record corrispondente della tabella referente. Una clausola di riferimento può essere anche aggunta ad una tabella preesistente:
oppure, eliminata:
Per aggiungere o eliminare una clausola PRIMARY KEY a oppure da una colonna:
Per aggiungere o eliminare una clausola UNIQUE a oppure da una colonna:
dove "symbol" è il nome del vincolo assegnato da MySQL. Per verificare quali vincoli sono stati impostati, in fase di creazione della tabella:
oppure:
oppure:
oppure:
Il valore NULL indica a MySQL che, in quel campo, non è stato inserito alcun valore. Una stringa vuota, indicata, solitamente con:
non può essere considerata al pari di un valore NULL, proprio perchè rappresenta una stringa. Vuota, ma pur sempre una stringa! Il valore NULL restituisce sempre un valore NULL, qualsiasi operazione venga eseguito su di esso:
Il valore NULL restituisce sempre FALSE, quando comparato a qualsiasi altro valore, NULL incluso:
Per questo motivo, una clausola WHERE non dovrà mai contenere una comparazione con NULL:
Per selezionare un record che contenga un campo con valore NULL, quindi, sarà necessario ricorrere a due operatori MySQL speciali:
oppure:
Le funzioni MySQL:
ignorano i campi NULL, mentre la funzione MySQL:
conta tutti i record presenti in una tabella, compresi i record che contengano valori NULL. Il solo caso in cui si può utilizzare l'espressione:
è con il comando UPDATE:
|
|||
I comandi Linux: MySQL ( 5 ) | Le guide di .bit: contenuto originale |