Partager via


Contraintes uniques et contraintes de vérification

Les contraintes UNIQUE et CHECK sont deux types de contraintes qui peuvent être utilisées pour appliquer l’intégrité des données dans les tables SQL Server. Ce sont des objets de base de données importants.

Cette rubrique contient les sections suivantes.

Contraintes Uniques

Contraintes CHECK

Tâches associées

Contraintes UNIQUES

Les contraintes sont des règles que le Moteur de base de données SQL Server applique pour vous. Par exemple, vous pouvez utiliser des contraintes UNIQUES pour vous assurer qu’aucune valeur en double n’est entrée dans des colonnes spécifiques qui ne participent pas à une clé primaire. Bien qu’une contrainte UNIQUE et une contrainte PRIMARY KEY appliquent l’unicité, utilisez une contrainte UNIQUE au lieu d’une contrainte PRIMARY KEY lorsque vous souhaitez appliquer l’unicité d’une colonne ou une combinaison de colonnes, qui n’est pas la clé primaire.

Contrairement aux contraintes PRIMARY KEY, les contraintes UNIQUES autorisent la valeur NULL. Toutefois, comme avec n’importe quelle valeur participant à une contrainte UNIQUE, une seule valeur Null est autorisée par colonne. Une contrainte UNIQUE peut être référencée par une contrainte FOREIGN KEY.

Lorsqu’une contrainte UNIQUE est ajoutée à une colonne ou à des colonnes existantes dans la table, par défaut, le moteur de base de données examine les données existantes dans les colonnes pour vous assurer que toutes les valeurs sont uniques. Si une contrainte UNIQUE est ajoutée à une colonne qui a des valeurs dupliquées, le moteur de base de données retourne une erreur et n’ajoute pas la contrainte.

Le moteur de base de données crée automatiquement un index UNIQUE pour appliquer l’exigence d’unicité de la contrainte UNIQUE. Par conséquent, si une tentative d’insertion d’une ligne en double est effectuée, le moteur de base de données retourne un message d’erreur indiquant que la contrainte UNIQUE a été violée et n’ajoute pas la ligne à la table. Sauf si un index cluster est explicitement spécifié, un index unique et non cluster est créé par défaut pour appliquer la contrainte UNIQUE.

Contraintes de vérification

Les contraintes CHECK appliquent l’intégrité du domaine en limitant les valeurs acceptées par une ou plusieurs colonnes. Vous pouvez créer une contrainte CHECK avec n’importe quelle expression logique (booléenne) qui retourne TRUE ou FALSE en fonction des opérateurs logiques. Par exemple, la plage de valeurs d’une colonne de salaire peut être limitée en créant une contrainte CHECK qui autorise uniquement les données comprises entre 15 000 $ et 100 000 $. De cette façon, il est impossible d'entrer des salaires non compris dans cette fourchette de salaires normaux. L'expression logique est la suivante : salary >= 15000 AND salary <= 100000.

Vous pouvez appliquer plusieurs contraintes CHECK à une seule colonne. Vous pouvez également appliquer une seule contrainte CHECK à plusieurs colonnes en la créant au niveau de la table. Par exemple, une contrainte CHECK à plusieurs colonnes peut être utilisée pour confirmer que n’importe quelle ligne avec une country_region avec une valeur USA a également une valeur à deux caractères dans la colonne state. Cela permet de vérifier plusieurs conditions au même emplacement.

Les contraintes CHECK sont similaires aux contraintes FOREIGN KEY dans lesquelles elles contrôlent les valeurs qui sont placées dans une colonne. La différence réside dans la façon dont elles déterminent les valeurs valides : les contraintes FOREIGN KEY obtiennent la liste des valeurs valides d’une autre table, tandis que les contraintes CHECK déterminent les valeurs valides d’une expression logique.

Avertissement

Les contraintes qui incluent une conversion de type de données implicite ou explicite peuvent entraîner l’échec de certaines opérations. Par exemple, de telles contraintes définies sur les tables qui sont des sources de basculement de partition peuvent entraîner l'échec d'une opération ALTER TABLE...SWITCH. Évitez les conversions de types de données dans les définitions des contraintes.

Limitations des contraintes CHECK

Les contraintes CHECK rejettent les valeurs qui sont évaluées à FALSE. Étant donné que les valeurs Null sont évaluées à UNKNOWN, leur présence dans les expressions peut remplacer une contrainte. Par exemple, supposons que vous placez une contrainte sur une int colonne MyColumn spécifiant que MyColumn ne peut contenir que la valeur 10 (MyColumn=10). Si vous insérez la valeur NULL dans MyColumn, le moteur de base de données insère NULL et ne retourne pas d’erreur.

Une contrainte CHECK retourne TRUE lorsque la condition qu’elle vérifie n’est pas FALSE pour une ligne de la table. Une contrainte CHECK fonctionne au niveau des lignes. Si une table qui vient d’être créée n’a pas de lignes, toute contrainte CHECK sur cette table est considérée comme valide. Cette situation peut produire des résultats inattendus, comme l'illustre l'exemple suivant.

CREATE TABLE CheckTbl (col1 int, col2 int);  
GO  
CREATE FUNCTION CheckFnctn()  
RETURNS int  
AS   
BEGIN  
   DECLARE @retval int  
   SELECT @retval = COUNT(*) FROM CheckTbl  
   RETURN @retval  
END;  
GO  
ALTER TABLE CheckTbl  
ADD CONSTRAINT chkRowCount CHECK (dbo.CheckFnctn() >= 1 );  
GO  

La contrainte CHECK ajoutée spécifie que la table CheckTbldoit contenir au moins une ligne. Toutefois, étant donné qu’il n’existe aucune ligne dans la table par rapport à laquelle vérifier la condition de cette contrainte, l’instruction ALTER TABLE réussit.

Les contraintes CHECK ne sont pas validées pendant les instructions DELETE. Par conséquent, l’exécution d’instructions DELETE sur des tables avec certains types de contraintes de vérification peut produire des résultats inattendus. Imaginons, par exemple, les instructions suivantes exécutées sur la table CheckTbl.

INSERT INTO CheckTbl VALUES (10, 10);  
GO  
DELETE CheckTbl WHERE col1 = 10;  

L'instruction DELETE aboutit, même si la contrainte CHECK spécifie que la table CheckTbl doit comporter au moins 1 ligne.

Tâches associées

Remarque

Si la table est publiée pour la réplication, vous devez apporter des modifications de schéma à l’aide de l’instruction Transact-SQL ALTER TABLE ou SQL Server Management Objects (SMO). Lorsque des modifications de schéma sont apportées à l’aide du Concepteur de tables ou du Concepteur de diagrammes de base de données, elle tente de supprimer et de recréer la table. Vous ne pouvez pas supprimer les objets publiés. Par conséquent, la modification du schéma échoue.

Tâche Sujet
Décrit comment créer une contrainte unique. Créer des contraintes uniques
Décrit comment modifier une contrainte unique. Modifier des contraintes uniques
Décrit comment supprimer une contrainte unique. Supprimer des contraintes uniques
Décrit comment désactiver une contrainte de validation lorsque l'Agent de réplication insère ou met à jour les données dans votre table. Désactiver des contraintes de validation pour la réplication
Décrit comment désactiver une contrainte de validation lorsque vous ajoutez, mettez à jour ou supprimez des données dans une table. Désactiver des contraintes de validation avec des instructions INSERT et UPDATE
Décrit comment modifier l'expression de contrainte ou les options qui activent ou désactivent la contrainte pour des conditions spécifiques. Modifier des contraintes de validation
Décrit comment supprimer une contrainte de validation. Supprimer des contraintes de validation
Décrit comment afficher les propriétés d'une contrainte de validation. Contraintes uniques et contraintes de validation