La contrainte CHECK, c'est un peu comme un videur à l'entrée de ta table. Elle garantit que les données que tu ajoutes dans la table respectent certaines conditions. Si tu essaies d'insérer des données qui ne respectent pas ces conditions, la base de données va tout simplement refuser de les accepter.
Imagine que tu veux ouvrir un magasin en Allemagne. Mais selon la loi, le dimanche est un jour de repos, et il est interdit de vendre ce jour-là. Cette règle, c'est l'équivalent d'un CHECK dans une base de données. Tu essaies de mettre l'horaire du magasin : ouvert 7 jours sur 7, mais le système te répond direct : "Nein, nein, dimanche — c'est interdit. Cet horaire ne passera pas la validation !"
Pareil dans la base de données : si tu mets une valeur qui ne respecte pas la règle CHECK, le système la bloque pour éviter une "erreur logique" dans tes données.
Pourquoi utiliser CHECK ?
- Assurer la qualité des données :
CHECKempêche l'insertion d'infos incorrectes ou illogiques dans la table. - Réduire les risques d'erreurs : au lieu de vérifier les données à la main avant l'insertion, tu peux laisser la base de données s'en occuper.
- Logique autonome : tu peux intégrer les règles de validation directement dans la structure de la base, sans devoir tout gérer côté code applicatif.
Comment fonctionne CHECK ?
La contrainte CHECK se définit à la création de la table ou tu peux l'ajouter plus tard avec la commande ALTER TABLE. Voilà la syntaxe de base :
CREATE TABLE table (
colonne type_de_donnée CHECK (condition)
);
condition — c'est une expression logique qui doit être vraie pour chaque valeur de la colonne concernée. Si la condition n'est pas respectée, la base de données renvoie une erreur.
Exemple 1 : Vérifier une plage de valeurs
Créons une table students où l'âge des étudiants (age) doit être compris entre 16 et 100 :
CREATE TABLE students (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL,
age INTEGER CHECK (age >= 16 AND age <= 100)
);
Maintenant, si tu essaies d'insérer un étudiant de 12 ans, la base de données va te "choper direct" :
INSERT INTO students (name, age)
VALUES ('Maria Chi', 12);
Erreur :
ERROR: new row for relation "students" violates check constraint "students_age_check"
DETAIL: Failing row contains (1, Maria Chi, 12).
Ouais, la base de données ici, c'est un videur sévère. Pas 16 ans ? Tu rentres pas.
Exemple 2 : Vérifier le format des données
Imaginons qu'on a une table emails pour stocker des adresses mail. On veut s'assurer que les adresses contiennent le caractère @ (c'est une vérif simplifiée) :
CREATE TABLE emails (
id SERIAL PRIMARY KEY,
email VARCHAR(255) CHECK (email LIKE '%@%')
);
Essayons d'ajouter une adresse incorrecte qui ne respecte pas la condition :
INSERT INTO emails (email)
VALUES ('notanemail.com');
Erreur :
ERROR: new row for relation "emails" violates check constraint "emails_email_check"
DETAIL: Failing row contains (1, notanemail.com).
Tu peux éviter l'erreur si toutes les données contiennent le caractère @ :
INSERT INTO emails (email)
VALUES ('example@student.com');
La requête passe sans souci.
Exemple 3 : Vérifier des conditions sur plusieurs colonnes
Les contraintes CHECK peuvent vérifier non seulement une colonne, mais aussi une expression logique qui dépend de plusieurs colonnes. Par exemple, prenons une table employees où le salaire (salary) doit être supérieur au bonus (bonus) :
CREATE TABLE employees (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL,
salary NUMERIC CHECK (salary > 0),
bonus NUMERIC CHECK (bonus >= 0),
CHECK (salary > bonus)
);
Maintenant, si quelqu'un essaie d'ajouter un employé avec un bonus supérieur au salaire, la base de données va refuser :
INSERT INTO employees (name, salary, bonus)
VALUES ('Otto Lin', 3000, 4000);
Erreur :
ERROR: new row for relation "employees" violates check constraint "employees_salary_bonus_check"
DETAIL: Failing row contains (1, Otto Lin, 3000, 4000).
Utilisation pratique
La contrainte CHECK est super utile quand ta logique métier est liée à des restrictions sur les données. Par exemple :
- Boutiques en ligne : interdire l'ajout de produits avec un prix négatif.
- Plateformes éducatives : vérifier l'âge des participants aux cours.
- Systèmes médicaux : s'assurer que la température corporelle d'un patient reste dans les limites autorisées.
Ces vérifications, c'est pas juste une couche de sécurité en plus, ça fait gagner du temps et évite des prises de tête aux devs et aux utilisateurs.
Particularités et erreurs courantes
Quand tu bosses avec CHECK, garde en tête ces points :
Les expressions logiques dans
CHECKdoivent être vraies pour toutes les lignes de la table. Si une seule ligne ne respecte pas la règle, il faut la corriger avant d'ajouter la contrainte.La vérification ne s'applique pas si la valeur insérée est
NULL. Autrement dit,CHECK (age >= 18)ne renverra pas d'erreur pourage = NULL. C'est parce que toute expression avecNULLdevient automatiquement indéfinie. Si tu veux interdireNULL, ajouteNOT NULL.Des conditions complexes dans
CHECKpeuvent ralentir les insertions et mises à jour, surtout sur de grosses tables.
GO TO FULL VERSION