Modifier et supprimer — UPDATE et DELETE
UPDATE SET WHERE (expressions : stock - 1, price * 0.9). DELETE FROM WHERE. Le danger du sans WHERE. TRUNCATE vs DELETE. Le filet de sécurité (SELECT avant UPDATE/DELETE). Safe update mode.
Concepts Théoriques
Les données changent constamment : un prix est ajusté après une négociation fournisseur, un stock diminue après une vente, un client supprime son compte, une commande est annulée. UPDATE modifie des lignes existantes. DELETE les supprime. Ces deux commandes sont puissantes — et dangereuses si mal utilisées.
UPDATE — modifier des lignes
La syntaxe : UPDATE table SET colonne1 = valeur1, colonne2 = valeur2 WHERE condition;
La clause WHERE est vitale. Sans WHERE, MySQL modifie TOUTES les lignes de la table. C'est la cause n°1 de catastrophes en base de données. Un UPDATE products SET price = 0; sans WHERE met tous vos prix à zéro. Un développeur a déjà vidé une base de production entière avec un UPDATE sans WHERE.
Vous pouvez modifier plusieurs colonnes en une seule requête : SET price = 12000, stock = 45, updated_at = NOW(). Vous pouvez utiliser des expressions : SET stock = stock - 1 (décrémenter après une vente), SET price = price * 0.9 (réduction de 10%), SET price = ROUND(price * 1.05, 2) (augmentation de 5%).
DELETE — supprimer des lignes
La syntaxe : DELETE FROM table WHERE condition;
Même règle absolue : TOUJOURS une clause WHERE. DELETE FROM products; sans WHERE supprime TOUS les produits. Contrairement à un fichier supprimé que vous pouvez restaurer depuis la corbeille, un DELETE en SQL est définitif — pas de Ctrl+Z.
TRUNCATE vs DELETE sans WHERE
Les deux vident une table entière, mais différemment :
- DELETE FROM products; parcourt et supprime les lignes une par une. C'est lent sur une grosse table, mais ça déclenche les triggers et conserve la valeur de l'auto-increment (le prochain id continue là où il en était).
- TRUNCATE TABLE products; réinitialise la table d'un coup. C'est instantané, mais ça remet l'auto-increment à 1, c'est irréversible, et ça ne déclenche pas les triggers.
En pratique : TRUNCATE pour vider une table de test, DELETE avec WHERE pour supprimer des lignes spécifiques en production.
Le filet de sécurité — SELECT avant UPDATE/DELETE
Avant CHAQUE UPDATE ou DELETE, exécutez un SELECT avec la même clause WHERE pour vérifier quelles lignes seront affectées :
- SELECT * FROM products WHERE category_id = 3; → vérifier que ce sont bien les bons produits
- Si le résultat est correct, transformer en : UPDATE products SET is_active = FALSE WHERE category_id = 3;
Cette habitude vous sauvera un jour. Prenez-la maintenant.
Le mode safe update de MySQL
MySQL a un mode de sécurité (sql_safe_updates) qui empêche les UPDATE/DELETE sans WHERE ou sans clé primaire dans la condition. Si vous avez l'erreur "Error Code: 1175", c'est ce mode qui vous protège. Désactivez-le temporairement avec SET SQL_SAFE_UPDATES = 0; si vous êtes sûr de votre requête.