SQL INSERT, UPDATE et DELETE : modifier les données
Jusqu'ici, toutes les requêtes lisaient des données sans rien changer. Trois commandes permettent de les modifier : INSERT ajoute des lignes, UPDATE change des valeurs existantes et DELETE supprime des lignes. Elles sont puissantes… et dangereuses : une condition oubliée peut modifier toute une table d'un coup.
Syntaxe
INSERT INTO table (col1, col2) VALUES (valeur1, valeur2);
UPDATE table SET col1 = valeur WHERE condition;
DELETE FROM table WHERE condition;Comment ça marche
INSERT : ajouter des lignes
Listez les colonnes à remplir, puis les valeurs dans le même ordre. Les colonnes non citées reçoivent leur valeur par défaut, ou NULL. On peut insérer plusieurs lignes d'un coup : VALUES (…), (…), (…).
UPDATE : modifier des lignes
SET indique les nouvelles valeurs, éventuellement calculées à partir des anciennes (prix = prix * 1.1). Le WHERE indique quelles lignes modifier. Sans WHERE, toutes les lignes de la table sont modifiées.
DELETE : supprimer des lignes
Même prudence : sans WHERE, toute la table est vidée. Quand des lignes en référencent d'autres (une ligne de commande pointe vers sa commande), supprimez d'abord les lignes « enfants ».
La bonne habitude
Avant un UPDATE ou un DELETE, exécutez un SELECT avec le même WHERE : vous voyez exactement les lignes qui seront touchées. Dans une vraie application, on regroupe les modifications dans une transaction (BEGIN … COMMIT), qu'on peut annuler avec ROLLBACK en cas d'erreur.
Schéma
| nom | categorie | prix |
|---|---|---|
| Guide SQL | Livres | 20 |
| Plaid | Maison | 25 |
| BD aventure | Livres | 10 |
| nom | categorie | prix |
|---|---|---|
| Guide SQL | Livres | 22 |
| Plaid | Maison | 25 |
| BD aventure | Livres | 11 |
Schéma simplifié pour illustrer le principe. Les exemples ci-dessous utilisent la vraie base d'exercices de SQL Quest (une boutique en ligne fictive : voir le schéma complet).
Exemples avec leurs résultats
1. Ajouter une ligne
On ajoute un fournisseur, puis on affiche la table pour vérifier. (Les exemples de cette page sont exécutés sur une copie de la base.)
INSERT INTO fournisseurs (id, nom, pays)
VALUES (8, 'NordicHome', 'Suède');
SELECT * FROM fournisseurs; Essayer dans le bac à sable| id | nom | pays |
|---|---|---|
| 1 | TechNova | France |
| 2 | ElectroPlus | Allemagne |
| 3 | MaisonDeco | France |
| 4 | SportZone | Espagne |
| 5 | BookWorld | Belgique |
| 6 | GreenFood | Italie |
| 7 | AsiaParts | Chine |
| 8 | NordicHome | Suède |
8 lignes au total
2. Modifier des lignes
On augmente de 10 % le prix des livres, puis on vérifie.
UPDATE produits
SET prix = ROUND(prix * 1.1, 2)
WHERE categorie = 'Livres';
SELECT nom, prix FROM produits WHERE categorie = 'Livres'; Essayer dans le bac à sable| nom | prix |
|---|---|
| Roman policier | 8,83 |
| Guide SQL | 27,78 |
| BD aventure | 10,98 |
| Livre de cuisine | 20,54 |
| Manga tome 1 | 31,81 |
5 lignes au total
3. Supprimer des lignes liées
On supprime les commandes annulées et leurs lignes de commande (les lignes « enfants » d'abord), puis on compte ce qu'il reste.
DELETE FROM lignes_commande
WHERE commande_id IN (SELECT id FROM commandes WHERE statut = 'annulée');
DELETE FROM commandes WHERE statut = 'annulée';
SELECT statut, COUNT(*) AS nb FROM commandes GROUP BY statut; Essayer dans le bac à sable| statut | nb |
|---|---|
| en cours | 109 |
| expédiée | 93 |
| livrée | 306 |
3 lignes au total
Les erreurs fréquentes
UPDATE ou DELETE sans WHERE
C'est l'erreur la plus coûteuse en SQL : toutes les lignes sont modifiées ou supprimées, sans confirmation.
UPDATE produits SET stock = 0;UPDATE produits SET stock = 0 WHERE id = 3;Un nombre de valeurs différent du nombre de colonnes
INSERT exige autant de valeurs que de colonnes listées, dans le même ordre.
INSERT INTO fournisseurs (id, nom, pays) VALUES (9, 'Test');INSERT INTO fournisseurs (id, nom, pays) VALUES (9, 'Test', 'France');Insérer un identifiant qui existe déjà
Une clé primaire doit être unique : SQLite répond UNIQUE constraint failed. Laissez la base choisir l'id, ou choisissez-en un libre.
INSERT INTO fournisseurs (id, nom, pays) VALUES (1, 'Doublon', 'France');INSERT INTO fournisseurs (nom, pays) VALUES ('Nouveau', 'France');Exercices
Essayez d'écrire la requête vous-même avant d'ouvrir la solution.
Défi 1. Mettez le stock à 0 pour les produits dont le fournisseur est basé en Chine, puis affichez ces produits.
Voir une solution
UPDATE produits SET stock = 0 WHERE fournisseur_id IN (SELECT id FROM fournisseurs WHERE pays = 'Chine');
SELECT nom, stock FROM produits WHERE stock = 0;| nom | stock |
|---|---|
| Haltères 5kg | 0 |
| Corde à sauter | 0 |
| Manga tome 1 | 0 |
3 lignes au total
Essayer dans le bac à sableDéfi 2. Ajoutez deux clients en une seule requête INSERT, puis comptez les clients.
Voir une solution
INSERT INTO clients (prenom, nom, ville) VALUES ('Nina', 'Petit', 'Lyon'), ('Paul', 'Morel', 'Nice');
SELECT COUNT(*) FROM clients;| COUNT(*) |
|---|
| 122 |
1 ligne au total
Essayer dans le bac à sableLes exercices interactifs sont corrigés automatiquement, avec un prof qui explique vos erreurs. Une leçon résumée reste affichée à côté de l'éditeur.
Questions fréquentes
Comment annuler un UPDATE ou un DELETE ?
Seulement s'il a été fait dans une transaction non validée (BEGIN … ROLLBACK). Une fois validée, la modification est définitive : d'où l'intérêt des sauvegardes et du SELECT de vérification préalable.
Quelle différence entre DELETE et DROP TABLE ?
DELETE supprime des lignes mais garde la table. DROP TABLE supprime la table entière, structure comprise.
Peut-on modifier plusieurs colonnes en un seul UPDATE ?
Oui : UPDATE produits SET prix = 19.9, stock = 50 WHERE id = 3.
Comment récupérer l'id d'une ligne qu'on vient d'insérer ?
En SQLite, avec last_insert_rowid() ou la clause RETURNING id (depuis la version 3.35). PostgreSQL propose aussi RETURNING.