Contraintes CHECK

Les contraintes CHECK assurent l'intégrité de domaine en limitant les valeurs acceptées par une colonne. Elles sont similaires aux contraintes FOREIGN KEY dans la mesure où elles contrôlent les valeurs qui sont placées dans une colonne. Leur différence réside dans la manière dont elles déterminent les valeurs considérées comme valides : Les contraintes FOREIGN KEY obtiennent la liste des valeurs valides d'une autre table, tandis que les contraintes CHECK déterminent ces valeurs sur la base d'une expression logique qui n'est pas fondée sur des données d'une autre colonne. Par exemple, il est possible de limiter la plage de valeurs d'une colonne salary 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.

Vous pouvez créer une contrainte CHECK avec n'importe quelle expression logique (booléenne) qui retourne TRUE ou FALSE sur la base des opérateurs logiques. Pour l'exemple précédent, l'expression logique est la suivante : salary >= 15000 AND salary <= 100000.

Vous pouvez appliquer plusieurs contraintes CHECK à une seule colonne. Vous pouvez aussi appliquer une seule contrainte CHECK à plusieurs colonnes en la créant au niveau de la table. Ainsi, vous pouvez recourir à une contrainte CHECK sur plusieurs colonnes pour confirmer que les lignes comportant la valeur USA dans leur colonne country/region possèdent également une valeur à deux caractères dans leur colonne state. Cela permet de vérifier plusieurs conditions au même emplacement.

AttentionAttention

Les contraintes qui incluent une conversion de type de données implicite ou explicite peuvent causer l'échec de certaines opérations. Par exemple, ces contraintes définies sur des tables qui sont les sources d'une commutation de partition peuvent causer 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 donnent FALSE. Comme les valeurs nulles donnent UNKNOWN, il se peut que leur présence dans les expressions supplante une contrainte. Supposons par exemple que vous placez une contrainte sur une colonne intMyColumn en spécifiant que MyColumn peut contenir uniquement 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 quelconque de la table. Si une table venant d'être créée ne comporte aucune ligne, les éventuelles contraintes CHECK sur cette table sont considérées comme valides. 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 CheckTbl doit contenir au moins une ligne. Toutefois, comme la table ne contient aucune ligne 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 peuvent 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 réussit, même si la contrainte CHECK spécifie que la table CheckTbl doit comporter au moins 1 ligne.