Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
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
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 |