Maîtrise des contraintes d'intégrité et de référence en SQL

Principes de l'intégrité des données

La fiabilité d'une base de données repose sur le respect de règles strictes régissent les valeurs autorisées et les relations entre les tables. L'application de contraintes lors de la création ou de la modification des structures permet de valider les opérations d'insertion, de mise à jour et de suppression, garantissant ainsi la cohérence globale du système.

On distingue généralement deux catégories principales :

  • L'intégrité des entités : Elle s'assure que chaque enregistrement est unique et correctement identifié au sein de sa propre table.
  • L'intégrité référentielle : Elle maintient la cohérence des liens entre plusieurs tables, empêchant par exemple l'existence d'enregistrements orphelins.

Typologie des contraintes SQL

1. Clé primaire (Primary Key)

Identifie de manière unique chaque ligne d'une tible. Elle implique automatiquement une contrainte d'unicité et de non-nullité. Elle peut être définie au niveau de la colonne ou de la table (pour les clés composites).

-- Définition au niveau de la table pour une clé composite
CONSTRAINT pk_staff_composite PRIMARY KEY (staff_id, department_id)

2. Non-nullité (Not Null)

Exige qu'une colonne contienne systématiquement une valeur. Cette règle ne peut être déclarée qu'au niveau de la colonne. Par défaut, les bases de données relationnelles comme Oracle autorisent les valeurs NULL.

3. Unicité (Unique)

Garantit que toutes les valeurs d'une colonne (ou d'une combinaison de colonnes) sont distinctes. Contrairement à la clé primaire, une colonne unique peut accepter une valeur NULL (selon le SGBD). Si la contrainte porte sur plusieurs champs, elle doit être déclarée au niveau de la table.

4. Vérification (Check)

Restreint les valeurs acceptables selon une expression booléenne. Les lignes avec des valeurs NULL échappent généralement à cette validation. Il est possible d'y intégrer des fonctions système (comme SYSDATE ou USER). Une même colonne peut posséder plusieurs contraintes CHECK, et une contrainte peut évaluer plusieurs colonnes simultanément (définition au niveau de la table obligatoire dans ce cas).

-- Syntaxe générale
CONSTRAINT chk_valid_email CHECK (email_address LIKE '%@%.%')
CONSTRAINT chk_staff_gender CHECK (gender IN ('M', 'F', 'O'))

5. Clé étrangère (Foreign Key)

Établit un lien entre une table enfant et une table parent en référençant une clé primaire ou unique. Si la valeur n'est pas NULL, elle doit obligatoirement exister dans la table parente. Cette contrainte est le pilier de l'intégrité référentielle.

Le comportement lors de la suppression d'un enregistrement parent peut être configuré :

  • Restriction (par défaut) : Empêche la suppression du parent si des enfants existent.
  • Suppression en cascade (ON DELETE CASCADE) : Supprime automatiquement les enregistrements enfants associés.
  • Mise à NULL (ON DELETE SET NULL) : Convertit les clés étrangères des enfants en NULL lors de la suppression du parent.

Implémentation pratique : Niveaux colonne et table

L'omission du mot-clé CONSTRAINT suivi d'un nom personnalisé force le moteur de base de données à générer un identifiant système (souvent préfixé par SYS_). Nommer explicitement les contraintes facilite grandement le débogage lors des violations.

Déclaration au niveau de la colonne

CREATE TABLE staff_members (
    staff_id      NUMBER(10)    CONSTRAINT pk_staff_id PRIMARY KEY,
    full_name     VARCHAR2(100) NOT NULL,
    national_id   VARCHAR2(50)  CONSTRAINT uq_national_id UNIQUE,
    email_address VARCHAR2(150) CONSTRAINT chk_email_format CHECK (email_address LIKE '%@%.%'),
    gender        CHAR(1)       CONSTRAINT chk_gender_opts CHECK (gender IN ('M', 'F', 'O')),
    dept_id       NUMBER(10)    CONSTRAINT fk_staff_dept 
                                REFERENCES corporate_departments(department_id) 
                                ON DELETE SET NULL
);

Déclaration au niveau de la table

CREATE TABLE corporate_departments (
    department_id   NUMBER(10)     NOT NULL,
    department_name VARCHAR2(100)  CONSTRAINT nn_dept_name NOT NULL,
    region_code     VARCHAR2(20),
    CONSTRAINT pk_corp_dept PRIMARY KEY (department_id),
    CONSTRAINT uq_dept_name_region UNIQUE (department_name, region_code)
);

Audit et inspection des contraintes

Pour analyser les règles appliquées dans un schéma Oracle, la vue du dictionnaire de données USER_CONSTRAINTS est l'outil de référence. Le champ CONSTRAINT_TYPE catégorise les règles actives :

  • P : Clé primaire (Primary Key)
  • U : Clé unique (Unique)
  • R : Clé étrangère (Referential / Foreign Key)
  • C : Contrainte de vérification (Check) ou Not Null

Une requête simple permet d'extraire ces métadonnées :

SELECT constraint_name, constraint_type, status
FROM user_constraints
WHERE table_name = 'STAFF_MEMBERS';

Étiquettes: SQL Oracle RelationalDatabase DataIntegrity Constraints

Publié le 25 juillet à 03h53