Les contraintes sur les tables et les colonnes vous permettent d'appliquer la qualité des données. En SQL, il existe deux manières de créer des contraintes sur une table :inline et hors ligne .
Dans cet article, je vais explorer ces contraintes et leurs avantages, ainsi que vous expliquer laquelle je recommande et pourquoi.
Qu'est-ce qu'une contrainte en ligne ?
Une contrainte en ligne est une contrainte que vous déclarez sur la même ligne que la colonne lors de la création d'une table.
CREATE TABLE employé (emp_id NUMBER(10) PRIMARY KEY,first_name VARCHAR2(200),last_name VARCHAR2(200),dept_id NUMBER(10));
Dans cet exemple, les mots PRIMARY KEY après la colonne emp_id indiquent que emp_id est la clé primaire.
Ainsi, nous avons créé une contrainte de clé primaire sur cette colonne en ajoutant les mots clés. Le concept est le même quel que soit le type de contrainte.
Qu'est-ce qu'une contrainte hors ligne ?
Une contrainte hors ligne est la contrainte déclarée sur une ligne distincte pour la colonne. Nous l'ajoutons à la fin de l'instruction CREATE TABLE.
Par exemple, nous avons le script suivant :
CREATE TABLE employé (emp_id NUMBER(10),first_name VARCHAR2(200),last_name VARCHAR2(200),dept_id NUMBER(10),CONSTRAINT pk_emp PRIMARY KEY (emp_id));
Comme vous pouvez le voir, nous définissons la contrainte PRIMARY KEY, appelée pk_emp , à la colonne emp_id à la fin de l'instruction.
Ce concept fonctionne de la même manière quel que soit le type de contrainte.
Analysons maintenant la différence entre ces deux types de contraintes, autre que l'endroit où elles sont déclarées.
Les contraintes hors ligne peuvent avoir des noms spécifiés
Lors de la création de contraintes hors ligne, nous pouvons spécifier un nom. Bien que cela puisse sembler une perte de temps, cela peut être utile.
Considérez ceci sur un exemple particulier :
CREATE TABLE employé (emp_id NUMBER(10),first_name VARCHAR2(200),last_name VARCHAR2(200),dept_id NUMBER(10),CONSTRAINT pk_emp PRIMARY KEY (emp_id),CONSTRAINT fk_emp_deptid FOREIGN KEY (dept_id) REFERENCES département (dept_id) ),CONSTRAINT ck_emp_lnlen CHECK (LENGTH(last_name)> 3));
Nous avons spécifié les noms suivants pour quelques contraintes :
- pk_emp
- fk_emp_deptid
- ck_emp_lnlen
Il peut sembler qu'il s'agit simplement d'une frappe inutile, mais ce n'est pas le cas. Nous allons regarder cela de plus près.
Alors, pourquoi devons-nous attribuer un nom à une contrainte ?
Avoir des contraintes nommées peut être utile dans plusieurs situations. Sans spécifier le nom, Oracle génère automatiquement un nom pour la contrainte comme il le fait pour toutes les contraintes en ligne. Habituellement, ce nom ne fournit aucune information utile.
Lorsque vous obtenez des erreurs dans les instructions SQL, le code PL/SQL ou le code d'application, il est judicieux d'utiliser le nom de la contrainte et de savoir à quoi il fait référence ou au moins de faire une supposition. Des noms tels que pk_emp ou ck_emp_lnlen serait plus descriptif que le générique EMP1290894FH nom.
De plus, lors de la révision des plans d'exécution, le nom de la contrainte est souvent utilisé dans la sortie, ce qui facilite la compréhension de la manière dont le plan est exécuté. Surtout, lorsque nous avons des cas déterminant si la clé primaire ou la clé étrangère sont utilisées.
Les contraintes NOT NULL ne peuvent être déclarées qu'en ligne
Il n'y a qu'un seul type de contrainte qui peut être déclaré comme une contrainte en ligne. Il s'agit de la contrainte NOT NULL.
Cela signifie que vous ne pouvez pas le déclarer comme hors ligne.
Exécutez le code suivant :
CREATE TABLE employé (emp_id NUMBER(10),first_name VARCHAR2(200),last_name VARCHAR2(200) NOT NULL,dept_id NUMBER(10));
Cependant, lors de l'exécution du code ci-dessous, nous pouvons voir que cela ne fonctionne pas :
CREATE TABLE employé (emp_id NUMBER(10),first_name VARCHAR2(200),last_name VARCHAR2(200),dept_id NUMBER(10),CONSTRAINT nn_emp_ln NOT NULL (last_name));
Pour résumer, pour les contraintes NOT NULL, il faut les déclarer inline.
Les contraintes CHECK peuvent faire référence à plusieurs colonnes
Si vous créez une contrainte en ligne CHECK, elle ne peut faire référence qu'à la colonne sur laquelle elle est créée.
Cependant, si vous créez une contrainte CHECK hors ligne, elle peut faire référence à plusieurs colonnes.
Créer l'employé table avec la contrainte CHECK comme indiqué ci-dessous :
CREATE TABLE employé (emp_id NUMBER(10),first_name VARCHAR2(200) CHECK (LENGTH(first_name)> 10),last_name VARCHAR2(200),dept_id NUMBER(10));
Cette contrainte indique que first_name doit dépasser 10 caractères.
Cependant, que se passerait-il si nous voulions préciser que la combinaison du prénom et du nom doivent dépasser 10 caractères ?
Pour ce faire, réécrivez le code en tant que contrainte hors ligne :
CREATE TABLE employee (emp_id NUMBER(10),first_name VARCHAR2(200),,last_name VARCHAR2(200),dept_id NUMBER(10),CONSTRAINT ck_fullname_len CHECK (LENGTH(first_name || last_name)> 10));Nous pouvons voir que cette règle ne peut être implémentée qu'avec une contrainte hors ligne.
Méthode recommandée
Après avoir analysé les deux méthodes :en ligne ou hors ligne, je recommande d'utiliser les contraintes hors ligne.
Il y a plusieurs raisons à cela.
Tout d'abord, vous pouvez spécifier un nom pour vos contraintes et les voir dans les messages d'erreur et les plans d'exécution internes. Cela peut également aider à désactiver et activer les contraintes.
Deuxièmement, les contraintes de vérification vous permettent de faire référence à des colonnes multiples et uniques. Ainsi, il est plus flexible de les ajouter en tant que contrainte hors ligne.
Enfin, le fait d'avoir toutes les contraintes déclarées comme hors ligne (à l'exception de NOT NULL qui ne peut être définie que comme une contrainte en ligne) facilite l'examen de votre syntaxe CREATE TABLE et la visualisation de toutes vos contraintes au même endroit. C'est important surtout dans les cas où il y a de grandes tables avec de nombreuses contraintes.
En conclusion, vous pouvez créer des contraintes en utilisant deux méthodes différentes :en ligne et hors ligne. Je recommande d'utiliser la méthode hors ligne lorsque vous le pouvez, car il y a plus de flexibilité, et de donner un nom aux contraintes, simplifiant ainsi l'analyse de vos plans d'exécution et d'autres informations SQL.