Avancé · 20 min
DML et transactions : modifier des données sans tout casser
INSERT, UPDATE et DELETE pour modifier des données, et BEGIN/COMMIT/ROLLBACK pour garantir que plusieurs modifications liées réussissent ou échouent ensemble.
Contexte
Jusqu'ici, chaque requête ne faisait que LIRE les données — jamais les changer. Mais une vraie base vit : un client s'inscrit, un prix change, une commande est annulée. INSERT, UPDATE et DELETE modifient les données en place, et une transaction garantit qu'un ensemble de modifications liées réussit intégralement, ou pas du tout.
Explication
INSERT ajoute une ou plusieurs lignes, UPDATE modifie les lignes qui correspondent à une condition, DELETE en supprime — les trois sont irréversibles une fois validés : sans WHERE, UPDATE et DELETE s'appliquent à TOUTE la table.
INSERT INTO table (col1, col2) VALUES (v1, v2);
UPDATE table SET col1 = v1 WHERE condition;
DELETE FROM table WHERE condition;
Une transaction regroupe plusieurs instructions avec BEGIN … COMMIT : soit elles réussissent toutes, soit — en cas d'erreur avant COMMIT — ROLLBACK annule tout ce qui a été fait depuis BEGIN. Sans BEGIN/COMMIT explicite, chaque instruction est validée séparément, immédiatement : impossible de revenir en arrière si la deuxième d'un groupe de trois échoue.
Pièges à connaître :
- UPDATE/DELETE sans WHERE modifie/supprime TOUTES les lignes de la table — toujours vérifier la condition avec un SELECT avant de valider.
- Une insertion ou une suppression peut échouer sur une contrainte de clé étrangère (une commande liée à des lignes_commande, par exemple) : l'ordre des opérations compte.
- ROLLBACK n'annule que ce qui suit le dernier BEGIN, jamais ce qui a déjà été COMMIT.
Exemple guidé
Sur la base boutique, annuler une commande payée par erreur suppose de mettre à jour son statut ET de supprimer le paiement associé — les deux doivent réussir ensemble :
BEGIN;
UPDATE commandes SET statut = 'annulee' WHERE id = 1;
DELETE FROM paiements WHERE commande_id = 1;
COMMIT;
Sans transaction, un problème entre les deux instructions laisserait la commande annulée mais son paiement toujours enregistré — une incohérence du même genre que celle que le LEFT JOIN … IS NULL de la leçon sur NULL sert justement à détecter après coup.
À retenir
INSERT ajoute, UPDATE modifie, DELETE supprime — chacun peut toucher toute la table sans WHERE. BEGIN … COMMIT valide un groupe d'instructions ensemble ; ROLLBACK l'annule avant COMMIT. Une transaction protège contre un échec partiel entre deux modifications liées.