⏳ Derniers jours d'octobre ! SQLtest.online est gratuit grâce aux dons, et nous devons encore atteindre l'objectif de ce mois pour que le site continue de fonctionner en novembre. Chaque don compte. Soutenir maintenant →
Code SQL copié dans le presse-papiers

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.

SQL UPDATE : SET attribue de nouvelles valeurs, WHERE choisit les lignes à modifier, et un UPDATE sans WHERE modifie toutes les lignes de la table

Syntaxe d'UPDATE

UPDATE table_name
SET column1 = value1,
    column2 = value2
WHERE condition;
  • UPDATE nomme la table.
  • SET liste les colonnes et leurs nouvelles valeurs.
  • WHERE choisit les lignes à modifier. Sans WHERE, 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

  1. Exécutez un SELECT avec le même WHERE et vérifiez les lignes et leur nombre.
  2. Exécutez ensuite l'UPDATE et comparez le nombre de « lignes affectées » avec le résultat du SELECT.
-- 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 condition modifie des lignes existantes.
  • Sans WHERE, toutes les lignes de la table sont modifiées.
  • SET peut affecter plusieurs colonnes et utiliser leurs valeurs actuelles.
  • Pour mettre à jour d'après une autre table, utilisez une sous-requête dans WHERE ou un UPDATE multi-tables ; dans MySQL, la sous-requête ne peut pas lire la table mise à jour.
  • Vérifiez d'abord les lignes avec SELECT et 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.

Essayez de resoudre les exercices suivants pour consolider ce que vous avez appris dans cette lecon.

  1. Mettre à jour le code postal
  2. Effectuer la mise à jour des prix
  3. Mettre à jour le coût de remplacement
  4. Mettre à jour les informations du projet
  5. Mettre à jour les salaires des postes