SQL Server UNIQUE Constraint (Italiano)

Summario: in questo tutorial, imparerete come usare il vincolo SQL Server UNIQUE per assicurare l’unicità dei dati contenuti in una colonna o in un gruppo di colonne.

Introduzione al vincolo UNIQUE di SQL Server

I vincoli SQL Server UNIQUE permettono di assicurare che i dati memorizzati in una colonna, o in un gruppo di colonne, siano unici tra le righe di una tabella.

La seguente dichiarazione crea una tabella i cui dati nella colonna email sono unici tra le righe della tabella hr.persons:

CREATE SCHEMA hr;GOCREATE TABLE hr.persons( person_id INT IDENTITY PRIMARY KEY, first_name VARCHAR(255) NOT NULL, last_name VARCHAR(255) NOT NULL, email VARCHAR(255) UNIQUE);
Code language: SQL (Structured Query Language) (sql)

In questa sintassi, si definisce il vincolo UNIQUE come un vincolo di colonna. Si può anche definire il vincolo UNIQUE come un vincolo di tabella, come questo:

CREATE TABLE hr.persons( person_id INT IDENTITY PRIMARY KEY, first_name VARCHAR(255) NOT NULL, last_name VARCHAR(255) NOT NULL, email VARCHAR(255), UNIQUE(email));
Code language: SQL (Structured Query Language) (sql)

Dietro le quinte, SQL Server crea automaticamente un UNIQUE indice per far rispettare l’unicità dei dati memorizzati nelle colonne che partecipano al UNIQUE vincolo. Pertanto, se si tenta di inserire una riga duplicata, SQL Server rifiuta la modifica e restituisce un messaggio di errore che indica che il vincolo UNIQUE è stato violato.

L’istruzione seguente inserisce una nuova riga nella tabella hr.persons:

INSERT INTO hr.persons(first_name, last_name, email)VALUES('John','Doe','[email protected]');
Code language: SQL (Structured Query Language) (sql)

L’istruzione funziona come previsto. Tuttavia, il seguente statement fallisce a causa della duplicazione dell’email:

INSERT INTO hr.persons(first_name, last_name, email)VALUES('Jane','Doe','[email protected]');
Code language: SQL (Structured Query Language) (sql)

QL Server ha emesso il seguente messaggio di errore:

Violation of UNIQUE KEY constraint 'UQ__persons__AB6E616417240E4E'. Cannot insert duplicate key in object 'hr.persons'. The duplicate key value is ([email protected]).
Code language: Shell Session (shell)

Se non si specifica un nome separato per il UNIQUE constraint, SQL Server genererà automaticamente un nome per esso. In questo esempio, il nome del vincolo è UQ__persons__AB6E616417240E4E, che non è molto leggibile.

Per assegnare un nome particolare a un vincolo UNIQUE, si usa la parola chiave CONSTRAINT come segue:

CREATE TABLE hr.persons ( person_id INT IDENTITY PRIMARY KEY, first_name VARCHAR(255) NOT NULL, last_name VARCHAR(255) NOT NULL, email VARCHAR(255), CONSTRAINT unique_email UNIQUE(email));
Code language: SQL (Structured Query Language) (sql)

I seguenti sono i vantaggi di assegnare a un UNIQUE vincolo un nome specifico:

  • È più facile classificare il messaggio di errore.
  • È possibile fare riferimento al nome del vincolo quando si desidera modificarlo.

Vincolo UNIQUE vs. PRIMARY KEY

Anche se entrambi i vincoli UNIQUE e PRIMARY KEY impongono l’unicità dei dati, si dovrebbe usare il vincolo UNIQUE invece del vincolo PRIMARY KEY quando si vuole imporre l’unicità di una colonna, o di un gruppo di colonne, che non sono le colonne chiave primaria.

Diversamente dai vincoli PRIMARY KEY, i vincoli UNIQUE permettono NULL. Inoltre, i vincoli UNIQUE trattano il NULL come un valore regolare, quindi, permette solo un NULL per colonna.

L’istruzione seguente inserisce una riga il cui valore nella colonna emailNULL:

INSERT INTO hr.persons(first_name, last_name)VALUES('John','Smith');
Code language: SQL (Structured Query Language) (sql)

Ora, se provate ad inserire un altro NULL nella colonna email, avrete un errore:

INSERT INTO hr.persons(first_name, last_name)VALUES('Lily','Bush');
Code language: SQL (Structured Query Language) (sql)

Ecco l’output:

Violation of UNIQUE KEY constraint 'UQ__persons__AB6E616417240E4E'. Cannot insert duplicate key in object 'hr.persons'. The duplicate key value is (<NULL>).
Code language: SQL (Structured Query Language) (sql)

Vincoli UNIQUE per un gruppo di colonne

Per definire un UNIQUE vincolo per un gruppo di colonne, lo si scrive come un vincolo di tabella con nomi di colonne separati da virgole come segue:

CREATE TABLE table_name ( key_column data_type PRIMARY KEY, column1 data_type, column2 data_type, column3 data_type, ..., UNIQUE (column1,column2));
Code language: SQL (Structured Query Language) (sql)

L’esempio seguente crea un vincolo UNIQUE che consiste di due colonne person_id e skill_id:

CREATE TABLE hr.person_skills ( id INT IDENTITY PRIMARY KEY, person_id int, skill_id int, updated_at DATETIME, UNIQUE (person_id, skill_id));
Code language: SQL (Structured Query Language) (sql)

Aggiungi vincoli UNIQUE alle colonne esistenti

Quando aggiungi un UNIQUE vincolo a una colonna esistente o a un gruppo di colonne in una tabella, SQL Server esamina prima i dati esistenti in queste colonne per assicurarsi che tutti i valori siano unici. Se SQL Server trova dei valori duplicati, allora restituisce un errore e non aggiunge il vincolo UNIQUE.

Il seguente mostra la sintassi per aggiungere un UNIQUE vincolo ad una tabella:

ALTER TABLE table_nameADD CONSTRAINT constraint_name UNIQUE(column1, column2,...);
Code language: SQL (Structured Query Language) (sql)

Supponiamo di avere la seguente hr.persons tabella:

CREATE TABLE hr.persons ( person_id INT IDENTITY PRIMARY KEY, first_name VARCHAR(255) NOT NULL, last_name VARCHAR(255) NOT NULL, email VARCHAR(255), phone VARCHAR(20),);
Code language: SQL (Structured Query Language) (sql)

La seguente dichiarazione aggiunge un UNIQUE vincolo alla colonna email:

ALTER TABLE hr.personsADD CONSTRAINT unique_email UNIQUE(email);
Code language: SQL (Structured Query Language) (sql)

Analogamente, la seguente dichiarazione aggiunge un vincolo UNIQUE alla colonna phone:

ALTER TABLE hr.personsADD CONSTRAINT unique_phone UNIQUE(phone);
Code language: SQL (Structured Query Language) (sql)

Eliminare i vincoli UNIQUE

Per definire un UNIQUE vincolo, si usa l’istruzione ALTER TABLE DROP CONSTRAINT come segue:

ALTER TABLE table_nameDROP CONSTRAINT constraint_name;
Code language: SQL (Structured Query Language) (sql)

La seguente dichiarazione rimuove il vincolo unique_phone dalla tabella hr.person:

ALTER TABLE hr.personsDROP CONSTRAINT unique_phone;
Code language: SQL (Structured Query Language) (sql)

Modificare i vincoli UNIQUE

SQL Server non ha nessuna istruzione diretta per modificare un UNIQUE vincolo, quindi, è necessario eliminare prima il vincolo e ricrearlo se si vuole cambiare il vincolo.

In questo tutorial, hai imparato ad usare il vincolo UNIQUE di SQL Server per assicurarti che i dati contenuti in una colonna o in un gruppo di colonne siano unici.

Lascia un commento

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