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
:
Code language: SQL (Structured Query Language) (sql)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);
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:
Code language: SQL (Structured Query Language) (sql)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));
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
:
Code language: SQL (Structured Query Language) (sql)INSERT INTO hr.persons(first_name, last_name, email)VALUES('John','Doe','[email protected]');
L’istruzione funziona come previsto. Tuttavia, il seguente statement fallisce a causa della duplicazione dell’email:
Code language: SQL (Structured Query Language) (sql)INSERT INTO hr.persons(first_name, last_name, email)VALUES('Jane','Doe','[email protected]');
QL Server ha emesso il seguente messaggio di errore:
Code language: Shell Session (shell)Violation of UNIQUE KEY constraint 'UQ__persons__AB6E616417240E4E'. Cannot insert duplicate key in object 'hr.persons'. The duplicate key value is ([email protected]).
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:
Code language: SQL (Structured Query Language) (sql)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));
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 email
NULL
:
Code language: SQL (Structured Query Language) (sql)INSERT INTO hr.persons(first_name, last_name)VALUES('John','Smith');
Ora, se provate ad inserire un altro NULL
nella colonna email
, avrete un errore:
Code language: SQL (Structured Query Language) (sql)INSERT INTO hr.persons(first_name, last_name)VALUES('Lily','Bush');
Ecco l’output:
Code language: SQL (Structured Query Language) (sql)Violation of UNIQUE KEY constraint 'UQ__persons__AB6E616417240E4E'. Cannot insert duplicate key in object 'hr.persons'. The duplicate key value is (<NULL>).
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:
Code language: SQL (Structured Query Language) (sql)CREATE TABLE table_name ( key_column data_type PRIMARY KEY, column1 data_type, column2 data_type, column3 data_type, ..., UNIQUE (column1,column2));
L’esempio seguente crea un vincolo UNIQUE
che consiste di due colonne person_id
e skill_id
:
Code language: SQL (Structured Query Language) (sql)CREATE TABLE hr.person_skills ( id INT IDENTITY PRIMARY KEY, person_id int, skill_id int, updated_at DATETIME, UNIQUE (person_id, skill_id));
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:
Code language: SQL (Structured Query Language) (sql)ALTER TABLE table_nameADD CONSTRAINT constraint_name UNIQUE(column1, column2,...);
Supponiamo di avere la seguente hr.persons
tabella:
Code language: SQL (Structured Query Language) (sql)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),);
La seguente dichiarazione aggiunge un UNIQUE
vincolo alla colonna email
:
Code language: SQL (Structured Query Language) (sql)ALTER TABLE hr.personsADD CONSTRAINT unique_email UNIQUE(email);
Analogamente, la seguente dichiarazione aggiunge un vincolo UNIQUE
alla colonna phone:
Code language: SQL (Structured Query Language) (sql)ALTER TABLE hr.personsADD CONSTRAINT unique_phone UNIQUE(phone);
Eliminare i vincoli UNIQUE
Per definire un UNIQUE
vincolo, si usa l’istruzione ALTER TABLE DROP CONSTRAINT
come segue:
Code language: SQL (Structured Query Language) (sql)ALTER TABLE table_nameDROP CONSTRAINT constraint_name;
La seguente dichiarazione rimuove il vincolo unique_phone
dalla tabella hr.person:
Code language: SQL (Structured Query Language) (sql)ALTER TABLE hr.personsDROP CONSTRAINT unique_phone;
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.