Constraint Mysql: cosa sono e quando usarle

Le constraint in Mysql sono dei vincoli da associare a uno o più campi che consentono uso ottimale nell’inserimento dei dati. Possono essere dichiarate subito o in un secondo momento.

Primary Key

Una tabella quasi sempre dovrebbe avere una chiave primaria. Si tratta di una delle constraint fondamentali di Mysql perché consente di rendere il campo univoco e obbligatorio e creare relazioni con altre tabelle.

Spesso è associata a un contatore che consente l’incremento automatico.

Si può dichiarare immediatamente:

Create table nometabella(id int primary key auto_increment);

Oppure successivamente:

Alter table nometabella add id int primary key auto_increment

Il campo auto_increment, di default è inizializzato a 0 tuttavia può essere impostato diversamente sia in fase di creazione che modifica della tabella.

Create table nometabella(id int primary key auto_increment) auto_increment=1000;

Oppure successivamente:

Alter table nometabella auto_increment=1000;

Dichiarare in un campo la constraint PK Primary Key e come se la si dichiarasse contemporaneamente come unique e not null tuttavia definendo una PK è possibile collegarla come foreign key (chiave esterna) di un’altra tabella.

In alcuni casi potrebbe essere necessario avere più di una chiave primaria, la dichiarazione va effettuata nel seguente modo:

Create table nometabella(campo1 varchar(20), campo2 varchar(20), primary key(campo1, campo2));

Oppure in un secondo momento tramite il comando Alter table:

Alter table nometabella22 add primary key(campo1, campo2);

Foreign Key

La creazione di una o più chiave esterne è alla base dei database relazionali perché consente di gestire dati su più tabelle.

Prima di associare le primary key PK alle foreign key FK è necessario avere le idee chiare sulle relazioni:

  • uno a uno
  • uno a molti
  • molti a molti

Uno a uno è un tipo di relazione piuttosto rara. Si tratta di un’estensione della tabella principale. Dove ai dati contenuti in un determinato record di una tabella corrispondono altri dati di un’altra tabella.

Uno a molti è la relazione più frequente. Significa che a un elemento possono essere associati più elementi ma non viceversa.

Molti a molti è la relazione dove a un elemento possono essere associati più elementi e viceversa. La creazione di una relazione N a N richiede la creazione di una specifica tabella.

La dichiarazione di una foreign key richiede necessariamente l’associazione a una chiave primaria della stessa tipologia.

Pertanto bisogna dapprima creare la tabella principale contenente la primary key e poi la tabella secondaria contenente una o più foreign key. Le FK possono anche essere dichiarate, inizialmente, come chiave primarie, questo consente l’inserimento di valori univoci.

Esempio di relazione uno a molti: una regione può avere più città ma una città può appartenere solamente a una regione.

Create table regioni(id_regione int primary key auto_increment, sigla_regione varchar(3) not null);
Create table citta(id_regione int, citta varchar(99) not null, sigla varchar(2) not null, foreign key(id_regione) references regioni(id_regione));

Unique

Questa constraint consente solamente l’inserimento di valori univoci, non accetta duplicati anche se, differentemente dalla PK, permette la presenza di valori nulli (tranne nel caso in cui sia associata alla constraint NOT NULL).

Unique si usa per tutti quei campi univoci ma non primari, ecco alcuni usi piuttosto frequenti:

  • Codice fiscale
  • Partita IVA
  • Codice IBAN
  • Codice Cliente
  • Numero di telefono
  • Indirizzo email
Create table anagrafica (id_utente int primary key auto_increment, nome varchar(255) not null, cognome varchar(255) not null, cf varchar(16) unique, telefono varchar(10) unique, email varchar(100) unique);

Not Null

L’aggiunta di questa constraint rende il campo obbligatorio, non può essere vuoto. Vedere l’esempio visto sopra unitamente alla constraint Unique.

Default

In alcuni casi potrebbe essere utile avere un valore predefinito in un campo, questo va dichiarato tramite la constraint Default.

Le stringhe vanno inserite tra virgolette ” oppure ‘ non è necessario per i numeri.

Inoltre, è possibile l’inserimento automatico della data e ora corrente del sistema in uso, funzionalità piuttosto utile nella registrazione dei registri (log). Per fare ciò il campo deve essere dichiarato come timestamp e default deve essere seguito da current_timestamp.

Create table prodotto (id_prodotto int primary key auto_increment, nome varchar(255) not null, descrizione varchar(255) default "Descrizione non disponibile", IVA int default=22, data_inserimento timestamp default current_timestamp);

Check

Per la convalida dati risulta essenziale inserire una constraint check. Un controllo sull’inserimento dei dati. Tramite check è possibile obbligare l’utente a inserire un numero predefinito di caratteri come nel caso del codice fiscale, partita IVA o codice IBAN.

Nell’esempio visto sopra, all’interno del paragrafo sulla constraint unique, abbiamo dichiarato nella varchar una lunghezza massima pari a quanti sono i caratteri di un codice fiscale tuttavia l’utente potrebbe così inserire anche un numero inferiore! Si rimedia con un check.

Create table anagrafica (id_utente int primary key auto_increment, nome varchar(255) not null, cognome varchar(255) not null, cf varchar(16) unique check(cf like"________________)", telefono varchar(10) unique, email varchar(100) unique);

Tuttavia questa soluzione è relativamente efficace giacché fa un controllo solamente sul numero di caratteri ma non sulla sua regolarità. Come sappiamo il codice fiscale, il codice IBAN o l’indirizzo email seguono una sintassi specifica. Se non viene inserita un’espressione regolare l’utente potrebbe anche inserire un insieme di caratteri, si univoci e si di lunghezza predefinita, ma che non hanno nulla di collegabile al valore effettivo.

Più utile può risultare l’inserimento del check per controlli più formali seppur limitati. Riprendendo l’esempio precedente si potrebbe aggiungere il campo sesso limitato all’inserimento di 2 opzioni: M o F.

Create table anagrafica3 (id_utente int primary key auto_increment, nome varchar(255) not null, cognome varchar(255) not null, sesso varchar(1) check(sesso IN("M","F")), telefono varchar(10) unique, email varchar(100) unique)

Index

Non si tratta di un vincolo ma di un modo per velocizzare la risposta del database nell’uso di ricerca e query più frequenti.

Create index nomeindice,
on nometabella(campo1);

Oppure un indice unico

Create unique index nomeindice,
on nometabella(campo1);

Describe

Non è una constraint ma è un’istruzione che permette di avere una visione panoramica della struttura della tabella.

describe nometabella;

Vengono mostrati nomi, tipi e coinstraint dei campi. Inclusi gli indici: PK, FK, U.

Fonte

Fonti delle informazioni presenti in questo articolo sono l’esperienza personale il manuale di W3CSchool.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *