Contrainte UNIQUE de SQL Server

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 :

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)

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 :

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)

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:

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

L’instruction fonctionne comme prévu. Cependant, l’instruction suivante échoue en raison du courriel en double :

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

SQL Server a émis le message d’erreur suivant :

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)

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 :

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)

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 :

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

Maintenant, si vous essayez d’insérer une autre NULL dans la colonne email, vous obtiendrez une erreur :

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

Voici le résultat :

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)

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 :

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’exemple suivant crée une contrainte UNIQUE qui se compose de deux colonnes person_id et 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)

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:

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

Supposons que vous ayez la table suivante hr.persons :

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)

L’instruction suivante ajoute une contrainte UNIQUE à la colonne email :

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

De même, l’instruction suivante ajoute une contrainte UNIQUE à la colonne téléphone :

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

Supprimer les contraintes UNIQUES

Pour définir une contrainte UNIQUE, vous utilisez l’instruction ALTER TABLE DROP CONSTRAINT comme suit :

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

L’instruction suivante supprime la contrainte unique_phone de la table hr.person:

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

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.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *