Le videur à l'entrée
Une contrainte est un videur à l'entrée de la table : la ligne qui ne respecte pas la règle ne rentre pas, et MySQL explique pourquoi.
prix DECIMAL(8,2) NOT NULL CHECK (prix > 0) INSERT ... prix = -20 → refusé
Protéger les données avec PRIMARY KEY, FOREIGN KEY, NOT NULL, UNIQUE, DEFAULT et CHECK, et comprendre l'intégrité référentielle (ON DELETE).
Dans l'ancien tableau Excel de Souk Atlas, on trouvait de tout : des commandes pour un client qui n'existe plus, des prix négatifs, deux clients avec le même email. Une base bien construite refuse ces erreurs toute seule : ce sont les contraintes d'intégrité, les règles de gestion écrites directement dans les tables.
commandes.client_id est une clé étrangère : elle doit contenir l'id d'un client qui existe.
| Contrainte | Elle interdit | Exemple |
|---|---|---|
PRIMARY KEY | les doublons et le vide sur l’identifiant | id INT AUTO_INCREMENT PRIMARY KEY |
NOT NULL | la case vide | nom VARCHAR(50) NOT NULL |
UNIQUE | deux lignes avec la même valeur | email VARCHAR(100) UNIQUE |
DEFAULT | rien : elle donne une valeur si on n’en fournit pas | stock INT DEFAULT 0 |
CHECK | les valeurs qui ne respectent pas une condition | CHECK (prix > 0) |
age INT CHECK (age BETWEEN 15 AND 60),
statut VARCHAR(12) CHECK (statut IN ('en attente', 'payée', 'livrée', 'annulée')),
email VARCHAR(100) CHECK (email LIKE '%_@_%._%'),
CONSTRAINT ck_dates CHECK (date_retour >= date_emprunt)
CREATE TABLE commandes (
id INT AUTO_INCREMENT PRIMARY KEY,
client_id INT NOT NULL,
date_commande DATE NOT NULL,
FOREIGN KEY (client_id) REFERENCES clients(id)
ON DELETE RESTRICT -- refuse de supprimer un client qui a des commandes
);
| Option | Si on supprime la ligne « parent »… |
|---|---|
ON DELETE RESTRICT (par défaut) | la suppression est refusée |
ON DELETE CASCADE | les lignes « enfants » sont supprimées aussi |
ON DELETE SET NULL | la clé étrangère des enfants passe à NULL |
Une contrainte peut recevoir un nom (CONSTRAINT nom ...) pour être retirée plus tard :
ALTER TABLE produits ADD CONSTRAINT ck_stock CHECK (stock >= 0);
ALTER TABLE clients ADD CONSTRAINT fk_ville FOREIGN KEY (ville_id) REFERENCES villes(id);
ALTER TABLE produits DROP CHECK ck_stock;
ALTER TABLE clients DROP FOREIGN KEY fk_ville;
Une contrainte est un videur à l'entrée de la table : la ligne qui ne respecte pas la règle ne rentre pas, et MySQL explique pourquoi.
prix DECIMAL(8,2) NOT NULL CHECK (prix > 0) INSERT ... prix = -20 → refusé
On ne peut pas réserver la chambre 512 d'un hôtel qui n'a que 300 chambres. De même, une commande ne peut pas pointer vers le client 999 s'il n'existe pas.
Le résultat de chaque requête s'affichera ici.
Consignes 0 / 4
Table stagiaires : id clé primaire auto, cin unique et obligatoire, nom obligatoire, age entre 15 et 60, filiere_id clé étrangère vers filieres(id), statut 'inscrit' par défaut.
CREATE TABLE stagiaires ( id INT AUTO_INCREMENT PRIMARY KEY, cin VARCHAR(10) NOT NULL UNIQUE, nom VARCHAR(60) NOT NULL, age INT CHECK (age BETWEEN 15 AND 60), filiere_id INT NOT NULL, statut VARCHAR(20) NOT NULL DEFAULT 'inscrit', FOREIGN KEY (filiere_id) REFERENCES filieres(id) );
La table clients existe déjà. Ajoutez une contrainte nommée uq_email qui rend l'email unique.
ALTER TABLE clients ADD CONSTRAINT uq_email UNIQUE (email);
On veut que la suppression d'une commande supprime automatiquement ses lignes. Écrivez la clé étrangère de lignes_commande vers commandes.
FOREIGN KEY (commande_id) REFERENCES commandes(id) ON DELETE CASCADE