SQL UPDATE : modifier des lignes existantes
Leçon 8.2 · Temps de lecture : ~7 min · Exercices pratiques ↓
L'instruction SQL UPDATE modifie des valeurs dans des lignes existantes d'une table. Dans cette leçon, vous apprendrez la syntaxe UPDATE ... SET ... WHERE, comment mettre à jour plusieurs colonnes et calculer de nouvelles valeurs à partir des valeurs actuelles, comment mettre à jour des lignes d'après une autre table, et comment vous assurer qu'une mise à jour ne modifie que les lignes voulues.
INSERT ajoute de nouvelles lignes ; UPDATE corrige et entretient celles qui existent : un client change d'e-mail, les prix augmentent, un statut passe de « actif » à « inactif ». Un UPDATE peut modifier une ligne ou des millions en une seule instruction, il mérite donc la même prudence que DELETE.
Les bases d'exemple de SQLtest sont en lecture seule, ces instructions y renvoient donc une erreur de permission. Les exemples utilisent le schéma Sakila.
Syntaxe d'UPDATE
UPDATE table_name
SET column1 = value1,
column2 = value2
WHERE condition;
UPDATEnomme la table.SETliste les colonnes et leurs nouvelles valeurs.WHEREchoisit les lignes à modifier. SansWHERE, toutes les lignes de la table sont mises à jour.
Mettre à jour une ligne
UPDATE customer
SET email = 'mary.smith@example.com'
WHERE customer_id = 1;
Résultat : une ligne modifiée ; la condition sur la clé primaire correspond à exactement un client.
Filtrer par la clé primaire est la façon la plus sûre de modifier une ligne précise : les noms peuvent se répéter, les clés non.
Mettre à jour plusieurs colonnes
Listez les affectations dans SET, séparées par des virgules :
UPDATE customer
SET first_name = 'ALICE',
last_name = 'COOPER',
email = 'alice.cooper@example.com'
WHERE customer_id = 42;
Résultat : trois colonnes du client 42 modifiées en une seule instruction.
Calculer à partir de la valeur actuelle
La partie droite de SET peut utiliser la valeur actuelle de la colonne :
UPDATE film
SET rental_rate = rental_rate + 1.00
WHERE rating = 'NC-17';
Résultat : le tarif de location des 210 films NC-17 augmente de 1 $.
Toutes les expressions de SET utilisent les valeurs d'avant la mise à jour, donc SET a = b, b = a échange deux colonnes en SQL standard. MySQL fait exception : il applique les affectations de gauche à droite, et les suivantes voient les nouvelles valeurs.
Mettre à jour des lignes d'après une autre table
Pour modifier des lignes selon une condition sur une autre table, utilisez une sous-requête dans WHERE. Augmentons de 10 % le tarif de location de toutes les comédies :
UPDATE film
SET rental_rate = rental_rate * 1.10
WHERE film_id IN (
SELECT fc.film_id
FROM film_category AS fc
INNER JOIN category AS c ON c.category_id = fc.category_id
WHERE c.name = 'Comedy'
);
Résultat : le tarif des 58 comédies augmente de 10 %.
MySQL et MariaDB n'autorisent pas la sous-requête à lire la table mise à jour : WHERE film_id IN (SELECT f.film_id FROM film f ...) échoue avec « You can't specify target table 'film' for update in FROM clause ». Écrivez la sous-requête sur les autres tables, comme ci-dessus.
MySQL et MariaDB prennent aussi en charge un UPDATE multi-tables avec JOIN :
UPDATE film AS f
INNER JOIN film_category AS fc ON fc.film_id = f.film_id
INNER JOIN category AS c ON c.category_id = fc.category_id
SET f.rental_rate = f.rental_rate * 1.10
WHERE c.name = 'Comedy';
PostgreSQL utilise plutôt UPDATE film SET ... FROM film_category, category WHERE ... ; SQL Server utilise UPDATE f SET ... FROM film f JOIN ....
Affecter NULL
UPDATE film
SET original_language_id = NULL
WHERE film_id = 10;
Notez la différence : SET column = NULL affecte « pas de valeur », alors que WHERE column = NULL ne correspond à rien ; dans les conditions, utilisez IS NULL.
Vérifier avant de mettre à jour
- Exécutez un
SELECTavec le mêmeWHEREet vérifiez les lignes et leur nombre. - Exécutez ensuite l'
UPDATEet comparez le nombre de « lignes affectées » avec le résultat duSELECT.
-- 1. Quelles lignes vont changer ?
SELECT film_id, title, rental_rate
FROM film
WHERE rating = 'NC-17';
-- 2. Modifier exactement ces lignes
UPDATE film
SET rental_rate = rental_rate + 1.00
WHERE rating = 'NC-17';
En production, exécutez les mises à jour importantes dans une transaction, pour pouvoir annuler une erreur. MySQL Workbench et le client MySQL ont aussi un mode « safe updates » qui rejette les UPDATE et DELETE sans condition sur une clé.
Points clés :
UPDATE table SET column = value WHERE conditionmodifie des lignes existantes.- Sans
WHERE, toutes les lignes de la table sont modifiées. SETpeut affecter plusieurs colonnes et utiliser leurs valeurs actuelles.- Pour mettre à jour d'après une autre table, utilisez une sous-requête dans
WHEREou unUPDATEmulti-tables ; dans MySQL, la sous-requête ne peut pas lire la table mise à jour. - Vérifiez d'abord les lignes avec
SELECTet comparez le nombre de lignes affectées.
Questions fréquentes
Que se passe-t-il si j'exécute UPDATE sans WHERE ?
Toutes les lignes de la table sont mises à jour. Seules une transaction non validée, un mode safe updates ou une sauvegarde peuvent alors vous protéger. Vérifiez toujours la clause WHERE avant d'exécuter un UPDATE.
Comment mettre à jour plusieurs colonnes en SQL ?
Listez-les dans SET, séparées par des virgules : UPDATE customer SET first_name = 'ALICE', last_name = 'COOPER' WHERE customer_id = 42;.
Comment mettre à jour une table avec des valeurs d'une autre table ?
Utilisez une sous-requête dans WHERE ou SET, ou une mise à jour multi-tables. Dans MySQL : UPDATE t1 JOIN t2 ON ... SET t1.col = t2.col WHERE ... ; dans PostgreSQL : UPDATE t1 SET col = t2.col FROM t2 WHERE t1.id = t2.id.