INSERT, UPDATE, DELETE en sécurité
Modifier des données : les trois commandes de base
INSERT INTO clients (nom, ville) VALUES ('Bernard', 'Marseille');
UPDATE clients SET ville = 'Nantes' WHERE id = 5;
DELETE FROM clients WHERE id = 5;
Le danger d'un WHERE oublié
UPDATE clients SET ville = 'Nantes';
DELETE FROM clients;
Sans clause WHERE, un UPDATE modifie toutes les lignes de la table, un DELETE les supprime toutes. C'est l'une des erreurs les plus destructrices et les plus fréquentes en SQL, souvent liée à une simple omission ou une exécution accidentelle avant d'avoir fini d'écrire la condition.
La transaction : tester avant de valider
BEGIN;
UPDATE clients SET ville = 'Nantes' WHERE ville = 'Nates'; -- faute de frappe
SELECT * FROM clients WHERE ville = 'Nantes'; -- vérifier le résultat avant de valider
ROLLBACK; -- annuler si le résultat ne correspond pas à l'attendu
-- ou COMMIT; pour valider définitivement si c'est correct
Une transaction permet de tester une modification, vérifier son résultat, puis décider de la valider (COMMIT) ou de l'annuler entièrement (ROLLBACK), un filet de sécurité précieux pour toute modification en production.
Cas concret
Un administrateur souhaite mettre à jour le statut d'un seul client mais exécute par erreur UPDATE clients SET statut = 'inactif'; sans clause WHERE, en oubliant de la taper avant d'appuyer sur Entrée. Sans transaction, les milliers de clients de la table passent instantanément en statut inactif, une erreur difficile à corriger sans sauvegarde récente. Avec l'habitude de toujours travailler dans une transaction (BEGIN avant, vérification, puis COMMIT ou ROLLBACK), l'erreur aurait été détectée et annulée avant toute conséquence réelle.
Erreurs fréquentes
- Exécuter UPDATE ou DELETE sans clause WHERE, la cause la plus fréquente et la plus destructrice d'incidents SQL en production.
- Ne jamais utiliser de transaction pour une modification risquée en production, se privant d'un filet de sécurité simple à mettre en place.
- Tester une requête DELETE directement en production sans l'avoir d'abord transformée en SELECT pour vérifier quelles lignes seraient réellement affectées.
À retenir
- Un UPDATE ou DELETE sans clause WHERE affecte absolument toutes les lignes de la table, une erreur destructrice fréquente.
- Une transaction (BEGIN / vérification / COMMIT ou ROLLBACK) permet de tester une modification avant de la valider définitivement.
- Transformer un DELETE en SELECT avec la même clause WHERE avant exécution révèle exactement quelles lignes seraient affectées.
Mini-exercice
Avant d'exécuter DELETE FROM clients WHERE date_inscription < '2020-01-01'; en production, quelle vérification simple faire pour éviter une mauvaise surprise ?
Réponse : exécuter d'abord SELECT * FROM clients WHERE date_inscription < '2020-01-01'; avec la même clause WHERE, pour visualiser précisément quelles lignes seraient supprimées avant de valider réellement le DELETE, idéalement dans une transaction pour pouvoir annuler si le résultat surprend.