Articles

Définition de contraintes dans CREATE TABLE dans Oracle 12c

Vous pouvez utiliser l’instruction CREATE TABLE pour appliquer plusieurs types de contraintes sur une table : clés candidates, clés primaires, clés étrangères et conditions de vérification. Une clause DE CONTRAINTE peut contraindre une seule colonne ou un groupe de colonnes dans une table. Le but de ces contraintes est d’amener Oracle à faire la majeure partie du travail pour maintenir l’intégrité de votre base de données. Plus vous ajoutez de contraintes à une définition de table, moins vous avez de travail à faire dans les applications pour gérer les données. D’autre part, plus il y a de contraintes dans une table, plus il faut de temps pour mettre à jour les données.

Vous pouvez spécifier des contraintes de deux manières : dans le cadre de la définition de colonne (appelée contrainte de colonne) ou à la fin de l’instruction CREATE TABLE (appelée contrainte de table). Les clauses qui contraignent plusieurs colonnes doivent être des contraintes de table.

La Clé candidate

Une clé candidate est une combinaison d’une ou plusieurs colonnes dont les valeurs identifient de manière unique chaque ligne d’une table. La liste suivante montre la création d’une contrainte UNIQUE pour la table de PROBLÈMES:

La clé de cette table est la combinaison de CITY et SAMPLE_DATE. Notez que les deux colonnes sont également déclarées NON NULLES. Cette fonctionnalité vous oblige à spécifier des valeurs pour certaines colonnes afin que les lignes soient insérées. De toute évidence, les informations sur la température et les précipitations ne sont pas utiles sans savoir où et quand elles ont été collectées. Cette technique est courante pour les colonnes qui sont la clé primaire de la table, mais elle est également utile si certaines colonnes sont essentielles pour que la ligne de données soit significative. Si NOT NULL n’est pas spécifié, la colonne peut avoir des valeurs NULL.

Lorsque vous créez une contrainte UNIQUE, Oracle crée un index unique pour appliquer l’unicité des valeurs. Dans une contrainte de clé primaire, au moins une des colonnes de la clé primaire pour chaque ligne ne doit pas être NULLE.

La clé primaire

La clé primaire d’une table est l’une des clés candidates que vous donnez des caractéristiques particulières. Vous ne pouvez avoir qu’une seule clé primaire et une colonne de clé primaire ne peut pas contenir de valeurs nulles.

L’instruction CREATE TABLE suivante a le même effet que la précédente, sauf que vous pouvez avoir plusieurs contraintes UNIQUES mais une seule contrainte de CLÉ PRIMAIRE :

Pour les clés primaires ou candidates à une seule colonne, vous pouvez définir la clé sur la colonne avec une contrainte de colonne au lieu d’une contrainte de table :

Dans ce cas, la colonne AUTHOR_NAME est la clé primaire et Oracle générera un nom pour la contrainte de CLÉ PRIMAIRE. Ceci n’est pas recommandé si vous souhaitez appliquer une norme de nommage commune pour les clés, comme indiqué plus loin dans  » Contraintes de nommage.”

Désignant les Tablespaces d’index

Les contraintes de CLÉ UNIQUE et PRIMAIRE créent des index. À moins que vous ne le disiez différemment à Oracle, ces index sont placés dans votre espace de table par défaut. Pour spécifier un espace de table différent, utilisez la clause USING INDEX TABLESPACE de la commande CREATE TABLE, comme indiqué dans la liste suivante :

L’index associé à la contrainte de clé primaire AUTHOR_PK sera placé dans l’espace de table USERS.

REMARQUE

Dans la plupart des installations par défaut, l’espace de table des UTILISATEURS est créé et est l’espace de table par défaut.

La clé étrangère

Une clé étrangère est une combinaison de colonnes avec des valeurs basées sur les valeurs de la clé primaire d’une autre table. Une contrainte de clé étrangère, également appelée contrainte d’intégrité référentielle, spécifie que les valeurs de la clé étrangère correspondent aux valeurs réelles de la clé primaire dans l’autre table. Dans la table BIBLIOTHÈQUE, par exemple, la colonne NOM_DE CATÉGORIE fait référence aux valeurs de la colonne NOM_DE CATÉGORIE de la table des CATÉGORIES :

Vous pouvez faire référence à une clé primaire ou unique, même dans la même table. Cependant, vous ne pouvez pas faire référence à une table dans une base de données distante dans la clause REFERENCES. Vous pouvez utiliser le formulaire de table (utilisé précédemment pour créer une CLÉ PRIMAIRE sur la table de PROBLÈMES) au lieu du formulaire de colonne pour spécifier des clés étrangères avec plusieurs colonnes.

Parfois, vous voudrez peut-être supprimer ces lignes dépendantes lorsque vous supprimez la ligne dont elles dépendent. Dans le cas de BOOKSHELF et CATEGORY, si vous supprimez un NOM de CATÉGORIE de la CATÉGORIE, vous voudrez peut-être rendre les valeurs de colonne NOM de CATÉGORIE de BIBLIOTHÈQUE correspondantes NULLES. Dans un autre cas, vous voudrez peut-être supprimer toute la ligne. La clause SUR DELETE CASCADE ajoutée à la clause REFERENCES indique à Oracle de supprimer la ligne dépendante lorsque vous supprimez la ligne correspondante dans la table parente. Cette action maintient automatiquement l’intégrité référentielle.

La contrainte de VÉRIFICATION

De nombreuses colonnes doivent avoir des valeurs qui se trouvent dans une certaine plage ou qui satisfont à certaines conditions. Avec une contrainte de VÉRIFICATION, vous pouvez spécifier une expression qui doit toujours être vraie pour chaque ligne de la table. Par exemple, la table de notation stocke les évaluations valides ; pour limiter les valeurs disponibles au-delà des limites imposées par la définition de colonne, vous pouvez utiliser une contrainte de vérification, comme indiqué dans la liste suivante :

Une contrainte de vérification au niveau de la colonne ne peut pas faire référence aux valeurs d’autres lignes ; elle ne peut pas utiliser les pseudo-colonnes telles que SYSDATE, USER, CURRVAL, NEXTVAL, LEVEL et ROWNUM. Vous pouvez utiliser le formulaire de contrainte de table (par opposition au formulaire de contrainte de colonne) pour faire référence à plusieurs colonnes dans une contrainte de CONTRÔLE.

Contraintes de nommage

Vous pouvez nommer vos contraintes. Si vous utilisez un schéma de nommage efficace pour vos noms de contraintes, vous serez mieux en mesure d’identifier et de gérer les contraintes. Le nom d’une contrainte doit identifier la table sur laquelle elle agit et le type de contrainte qu’elle représente. Par exemple, la clé primaire de la table des PROBLÈMES peut être nommée TROUBLE_PK.

Vous pouvez spécifier un nom pour une contrainte lorsque vous créez la contrainte. Si vous ne spécifiez pas de nom pour la contrainte, Oracle génère un nom. La plupart des noms de contraintes générés par Oracle sont de la forme SYS_C ###### (par exemple, SYS_C000145). Étant donné que le nom de contrainte généré par le système ne vous dit rien sur la table ou la contrainte, vous devez nommer vos contraintes.

Dans l’exemple suivant, la contrainte de CLÉ PRIMAIRE est créée et nommée, dans le cadre de la commande CREATE TABLE pour la table de PROBLÈMES (notez la clause CONSTRAINT):

La clause de CONTRAINTE de la commande CREATE TABLE nomme la contrainte (dans ce cas, TROUBLE_PK). Vous pouvez utiliser ce nom de contrainte plus tard lors de l’activation ou de la désactivation des contraintes.