Contraintes

Les contraintes permettent de définir la manière dont le Moteur de base de données applique automatiquement l'intégrité d'une base de données. Les contraintes définissent des règles relatives aux valeurs autorisées dans les colonnes et elles constituent le mécanisme standard de mise en application de l'intégrité. Il est préférable d'utiliser des contraintes plutôt que des Déclencheurs DML, des règles et des valeurs par défaut. L'optimiseur de requête utilise également des définitions de contraintes pour créer des plans d'exécution de requêtes performants.

Classes de contraintes

SQL Server prend en charge les classes de contraintes suivantes :

  • NOT NULL indique que la colonne n'accepte pas les valeurs NULL. Pour plus d'informations, consultez Autorisation des valeurs NULL.

  • Les contraintes CHECK garantissent l'intégrité du domaine en limitant les valeurs susceptibles d'être placées dans une colonne. Pour plus d'informations, consultez Contraintes CHECK.

    Une contrainte CHECK indique une condition de recherche de type booléen (valeur TRUE, FALSE ou inconnue) qui est appliquée à toutes les valeurs entrées dans la colonne. Toutes les valeurs correspondant à FALSE sont rejetées. Vous pouvez spécifier plusieurs contraintes CHECK pour chaque colonne. L'exemple suivant présente la création d'une contrainte chk_id. Cette contrainte applique également le domaine de la clé primaire en vérifiant que seuls les nombres compris dans une plage spécifiée sont entrés pour la clé.

    CREATE TABLE cust_sample
       (
       cust_id            int      PRIMARY KEY,
       cust_name         char(50),
       cust_address         char(50),
       cust_credit_limit   money,
       CONSTRAINT chk_id CHECK (cust_id BETWEEN 0 and 10000 )
       )
    
  • Les contraintes UNIQUE garantissent le caractère unique des valeurs dans un ensemble de colonnes.

    Dans une contrainte UNIQUE, deux lignes d'une table ne peuvent pas posséder la même valeur dans les colonnes. Les clés primaires mettent aussi en application l'unicité des valeurs, mais elles n'autorisent pas les valeurs NULL comme l'une des valeurs uniques. Pour plus d'informations, consultez Contraintes UNIQUE.

  • Les contraintes PRIMARY KEY identifient une colonne ou un ensemble de colonnes possédant des valeurs qui identifient de manière unique chaque ligne d'une table. Pour plus d'informations, consultez Contraintes PRIMARY KEY.

    Deux lignes d'une table ne peuvent pas avoir la même valeur de clé primaire. Dans une clé primaire, il est impossible d'entrer une valeur NULL dans une colonne. Il est recommandé d'utiliser une petite colonne de type entier comme clé primaire. Chaque table doit avoir une clé primaire. Une colonne ou une association de colonnes qui est désignée comme valeur de clé primaire est appelée une clé candidate.

    L'exemple suivant crée la table part_sample et spécifie le champ part_nmbr en tant que clé primaire.

    CREATE TABLE part_sample
             (part_nmbr      int         PRIMARY KEY,
             part_name      char(30),
             part_weight      decimal(6,2),
             part_color      char(15) );
    
  • Les contraintes FOREIGN KEY identifient et appliquent les relations entre des tables. Pour plus d'informations, consultez Contraintes FOREIGN KEY.

    Une clé étrangère dans une table pointe sur une clé candidate dans une autre table. Dans l'exemple suivant, la table order_part crée une clé étrangère qui référence la table part_sample définie précédemment.

    CREATE TABLE order_part
          (order_nmbr      int,
          part_nmbr      int
             FOREIGN KEY REFERENCES part_sample(part_nmbr)
                ON DELETE NO ACTION,
          qty_ordered      int);
    GO
    

    Vous ne pouvez pas insérer de ligne ayant une valeur de clé étrangère (à l'exception de NULL) s'il n'existe pas de clé candidate possédant cette valeur. La clause ON DELETE détermine les actions qui sont effectuées lorsque vous tentez de supprimer une ligne vers laquelle pointent les clés étrangères existantes. Les options de la clause ON DELETE sont les suivantes :

    • NO ACTION spécifie que la suppression échoue en générant une erreur.

    • CASCADE spécifie que toutes les lignes comportant des clés étrangères qui pointent vers la ligne supprimée sont également supprimées.

    • SET NULL spécifie que toutes les lignes comportant des clés étrangères qui pointent vers la ligne supprimée prennent la valeur NULL.

    • SET DEFAULT spécifie que toutes les lignes comportant des clés étrangères qui pointent vers la ligne supprimée prennent leur valeur par défaut. Pour plus d'informations, consultez Valeurs par défaut.

    La clause ON UPDATE définit les actions qui sont effectuées si vous tentez de mettre à jour une valeur de clé candidate vers laquelle pointent les clés étrangères existantes. Cette clause accepte également les options NO ACTION, CASCADE, SET NULL et SET DEFAULT.

Contraintes de colonnes et de tables

Les contraintes peuvent porter sur une colonne ou sur une table. Une contrainte de colonne est déclarée comme faisant partie de la définition d'une colonne et s'applique uniquement à cette colonne (c'est le cas des contraintes des exemples précédents). Une contrainte de table est déclarée indépendamment de la définition de la colonne et s'applique à plusieurs colonnes d'une table. Les contraintes de table sont obligatoires lorsque plusieurs colonnes doivent être incluses dans une contrainte.

Si, par exemple, une table dispose de deux colonnes ou plus dans la clé primaire, vous devez utiliser une contrainte de table pour inclure les deux colonnes dans la clé primaire. Prenons l'exemple d'une table qui enregistre les événements survenant sur un ordinateur dans une usine. Supposons que plusieurs types d'événements peuvent se produire au même moment, mais dans ce cas, il ne peut pas exister deux événements du même type. Pour reproduire ce cas de figure dans la table, vous devez inclure les colonnes event_type et event_time dans une clé primaire à deux colonnes, comme l'illustre l'exemple suivant.

CREATE TABLE factory_process
   (event_type   int,
   event_time   datetime,
   event_site   char(50),
   event_desc   char(1024),
CONSTRAINT event_key PRIMARY KEY (event_type, event_time) )

Voir aussi

Référence

Autres ressources