Résumé : dans ce tutoriel, vous apprendrez à utiliser la contrainte UNIQUE
de SQL Server pour garantir l’unicité des données contenues dans une colonne ou un groupe de colonnes.
Introduction à la contrainte UNIQUE de SQL Server
Les contraintes de SQL Server UNIQUE
vous permettent de garantir que les données stockées dans une colonne, ou un groupe de colonnes, sont uniques parmi les lignes d’une table.
L’instruction suivante crée une table dont les données de la colonne email
sont uniques parmi les rangs de la table 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);
Dans cette syntaxe, vous définissez la contrainte UNIQUE
comme une contrainte de colonne. Vous pouvez également définir la contrainte UNIQUE
comme une contrainte de table, comme ceci :
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));
Dans les coulisses, SQL Server crée automatiquement un UNIQUE
index pour renforcer l’unicité des données stockées dans les colonnes qui participent à la contrainte UNIQUE
. Par conséquent, si vous tentez d’insérer une ligne en double, SQL Server rejette la modification et renvoie un message d’erreur indiquant que la contrainte UNIQUE
a été violée.
L’instruction suivante insère une nouvelle ligne dans la table hr.persons
:
Code language: SQL (Structured Query Language) (sql)INSERT INTO hr.persons(first_name, last_name, email)VALUES('John','Doe','[email protected]');
L’instruction fonctionne comme prévu. Cependant, l’instruction suivante échoue en raison du courriel en double :
Code language: SQL (Structured Query Language) (sql)INSERT INTO hr.persons(first_name, last_name, email)VALUES('Jane','Doe','[email protected]');
SQL Server a émis le message d’erreur suivant :
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]).
Si vous ne spécifiez pas un nom distinct pour la contrainte UNIQUE
, SQL Server générera automatiquement un nom pour celle-ci. Dans cet exemple, le nom de la contrainte est UQ__persons__AB6E616417240E4E
, ce qui n’est pas tout à fait lisible.
Pour attribuer un nom particulier à une contrainte UNIQUE
, vous utilisez le mot-clé CONSTRAINT
comme suit :
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));
Voici les avantages d’attribuer à une contrainte UNIQUE
un nom spécifique :
- Il est plus facile de classer le message d’erreur.
- Vous pouvez faire référence au nom de la contrainte lorsque vous souhaitez la modifier.
Contrainte UNIQUE vs. Contrainte PRIMARY KEY
Bien que les deux contraintes UNIQUE
et PRIMARY KEY
appliquent l’unicité des données, vous devriez utiliser la contrainte UNIQUE
au lieu de la contrainte PRIMARY KEY
lorsque vous voulez renforcer l’unicité d’une colonne, ou d’un groupe de colonnes, qui ne sont pas les colonnes de clé primaire.
Différente des contraintes PRIMARY KEY
, les contraintes UNIQUE
permettent NULL
. De plus, les contraintes UNIQUE
traitent la NULL
comme une valeur régulière, par conséquent, elle ne permet qu’une NULL
par colonne.
L’instruction suivante insère une ligne dont la valeur de la colonne email
est NULL
:
Code language: SQL (Structured Query Language) (sql)INSERT INTO hr.persons(first_name, last_name)VALUES('John','Smith');
Maintenant, si vous essayez d’insérer une autre NULL
dans la colonne email
, vous obtiendrez une erreur :
Code language: SQL (Structured Query Language) (sql)INSERT INTO hr.persons(first_name, last_name)VALUES('Lily','Bush');
Voici le résultat :
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>).
Contraintes UNIQUES pour un groupe de colonnes
Pour définir une UNIQUE
contrainte pour un groupe de colonnes, vous l’écrivez comme une contrainte de table avec les noms de colonnes séparés par des virgules comme suit :
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’exemple suivant crée une contrainte UNIQUE
qui se compose de deux colonnes person_id
et 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));
Ajouter des contraintes UNIQUE à des colonnes existantes
Lorsque vous ajoutez une contrainte UNIQUE
à une colonne existante ou à un groupe de colonnes dans une table, SQL Server examine d’abord les données existantes dans ces colonnes pour s’assurer que toutes les valeurs sont uniques. Si SQL Server trouve les valeurs en double, alors il renvoie une erreur et n’ajoute pas la contrainte UNIQUE
.
L’exemple suivant montre la syntaxe d’ajout d’une contrainte UNIQUE
à une table:
Code language: SQL (Structured Query Language) (sql)ALTER TABLE table_nameADD CONSTRAINT constraint_name UNIQUE(column1, column2,...);
Supposons que vous ayez la table suivante hr.persons
:
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),);
L’instruction suivante ajoute une contrainte UNIQUE
à la colonne email
:
Code language: SQL (Structured Query Language) (sql)ALTER TABLE hr.personsADD CONSTRAINT unique_email UNIQUE(email);
De même, l’instruction suivante ajoute une contrainte UNIQUE
à la colonne téléphone :
Code language: SQL (Structured Query Language) (sql)ALTER TABLE hr.personsADD CONSTRAINT unique_phone UNIQUE(phone);
Supprimer les contraintes UNIQUES
Pour définir une contrainte UNIQUE
, vous utilisez l’instruction ALTER TABLE DROP CONSTRAINT
comme suit :
Code language: SQL (Structured Query Language) (sql)ALTER TABLE table_nameDROP CONSTRAINT constraint_name;
L’instruction suivante supprime la contrainte unique_phone
de la table hr.person:
Code language: SQL (Structured Query Language) (sql)ALTER TABLE hr.personsDROP CONSTRAINT unique_phone;
Modifier les contraintes UNIQUE
SQL Server n’a pas d’instruction directe pour modifier une UNIQUE
contrainte, par conséquent, vous devez d’abord faire tomber la contrainte et la recréer si vous voulez la modifier.
Dans ce tutoriel, vous avez appris à utiliser la contrainte UNIQUE
de SQL Server pour vous assurer que les données contenues dans une colonne ou dans un groupe de colonnes sont uniques.