Vincoli di integrità in MYSQL

Spieghiamo cosa sono i vincoli di integrità in MYSQL.

Dopo aver creato delle tabelle (ovvero delle entità) tramite PhpMyAdmin, si possono stabilire le relazioni tra le tabelle se ce ne sono.

Per farlo andare nel pannello di controllo di PhpMyAdmin e scegliere il button Struttura, poi cliccare su Vista Relazioni. Qui è possibile specificare delle azioni quando vengono modificate o eliminate delle  righe nelle tabelle collegate. 
Ovvero si stabiliscono delle clausole di vincolo sull’integrità referenziale, spesso utilizzate con chiavi esterne.
Ecco alcuni vincoli di integrità in MYSQL più comuni e studiamo il loro impatto sulle operazioni di modifica o eliminazione:

ON DELETE:

  • RESTRICT: Impedisce l’eliminazione della riga padre se ci sono righe figlio collegate ad essa tramite la chiave esterna. Se si tenta di eliminare la riga padre, verrà generato un errore.
  • CASCADE: Quando viene eliminata una riga padre, questa clausola eliminerà automaticamente tutte le righe figlio collegate tramite la chiave esterna.
  • SET NULL: Imposta automaticamente i valori della colonna figlio collegata a NULL quando viene eliminata la riga padre.

ON UPDATE:

  • RESTRICT: Impedisce l’aggiornamento del valore della chiave esterna nella riga padre se ci sono righe figlio collegate ad essa.
  • CASCADE: Quando viene modificato il valore della chiave esterna nella riga padre, questa clausola aggiorna automaticamente i valori corrispondenti nelle righe figlio.

Queste clausole vengono utilizzate per garantire l’integrità referenziale tra le tabelle.

Ad esempio, se si ha una tabella “genitore” con una chiave esterna in una tabella “figlia”, l’uso di ON DELETE CASCADE può essere utile se si vuole eliminare automaticamente tutti i record “figli” quando viene eliminato un record “genitore”.

Vediamo come rappresentare il vincolo di integrità tramite codice SQL:

CREATE TABLE genitori (

    id INT PRIMARY KEY

);

CREATE TABLE figli (

    id INT PRIMARY KEY,

    genitore_id INT,

    FOREIGN KEY (genitore_id) REFERENCES genitori(id) ON DELETE CASCADE

);

In questo modo, quando un record nella tabella “genitori” viene eliminato, tutti i record corrispondenti nella tabella “figli” con il campo genitore_id corrispondente verranno eliminati automaticamente grazie alla clausola ON DELETE CASCADE.

Alcuni tipi di dati in MySQL

Quando lavoriamo con i database in mysql possiamo trovarci a studiare tanti tipi di dati. Vediamo quelli più comuni:

  • TINYINT → occupa 1 byte può memorizzare valori compresi tra -128 e 127 (o da 0 a 255 se utilizzato senza segno), ovvero 2^8 possibili combinazioni.
  • SMALLINT  → occupa 2 byte può memorizzare valori compresi tra -32768 e 32767 (o da 0 a 65535 se utilizzato senza segno), ovvero 2 ^ 16 possibili combinazioni.
  • INT  → occupa 4 byte può memorizzare valori compresi tra -2147483648 e 2147483647 (o da 0 a 4.294.967.295 se utilizzato senza segno), ovvero 2 ^ 32 possibili combinazioni.
  • BIGINT  → occupa 8 byte può memorizzare valori compresi tra -9223372036854775808 e 9223372036854775807 (o da 0 a 18446744073709551615 se utilizzato senza segno),ovvero 2 ^ 64 possibili combinazioni. N.B Il tipo di dati BIGINT è stato progettato per essere utilizzato quando i valori interi potrebbero non rientrare nell’intervallo supportato dal tipo di dati INT.
  • DECIMAL è utilizzato per memorizzare numeri decimali esatti. Ad esempio DECIMAL(10, 2) indica un numero con una precisione totale di 10 cifre, di cui 2 dopo la virgola.
  • FLOAT è utilizzato per memorizzare numeri decimali a virgola mobile (floating-point). È utile per applicazioni scientifiche o ingegneristiche dove la precisione esatta potrebbe non essere fondamentale e si desidera gestire un range più ampio di numeri decimali.
  • DATE: Memorizza date nel formato ‘YYYY-MM-DD’.
  • TIME: Memorizza un orario nel formato ‘HH:MM:SS’.
  • DATETIME: Memorizza data e ora nel formato ‘YYYY-MM-DD HH:MM:SS’.
  • TIMESTAMP: Memorizza una data e ora, ma viene convertito dal fuso orario locale al fuso orario UTC per l’archiviazione.
  • CHAR: Memorizza stringhe di lunghezza fissa. Richiede una lunghezza specificata al momento della creazione della tabella e occupa lo spazio specificato anche se il dato effettivo è più corto.
  • VARCHAR: Memorizza stringhe di lunghezza variabile. Utilizza solo lo spazio necessario per il valore effettivo, fino a una lunghezza massima specificata durante la creazione della tabella. La lunghezza massima è 255 caratteri.
  • TEXT supporta fino a 65.535 caratteri.
  • MEDIUMTEXT supporta fino a 16.777.215 caratteri.
  • LONGTEXT supporta fino a 4.294.967.295 caratteri.

Ci sono tanti altri tipi di dati che è possibile utilizzare in MYSQL, quelli indicati sono tra i più comuni.