SQL UPDATE: Comment mettre à jour des données en SQL ?

Par :

,le

La commande SQL UPDATE modifie les données existantes dans une table de base de données. Cette instruction cible des lignes spécifiques via une clause WHERE et remplace les valeurs des colonnes désignées par la clause SET. Les développeurs utilisent UPDATE pour corriger des erreurs, actualiser des prix, changer des statuts ou synchroniser des informations entre tables SQL.

Son utilité réside dans la maintenance continue des données métier. Les bases de données sans mise à jour des enregistrements deviendraient rapidement obsolètes : prix périmés, adresses erronées, stocks faux. UPDATE fait partie des commandes SQL les plus utilisées , car toute application nécessite des corrections régulières. Sans cette commande, les administrateurs devraient recréer entièrement les tables pour chaque modification, paralysant les opérations critiques.

Syntaxe de base

La syntaxe de la commande SQL UPDATE repose sur trois éléments obligatoires : le nom de la table, la clause SET pour les nouvelles valeurs, et la clause WHERE pour cibler les lignes. Sans la condition WHERE, toutes les lignes de la table sont modifiées sans exception. Cette règle s’applique de manière identique sur MySQL, PostgreSQL, SQL Server et MariaDB.

UPDATE produits SET prix = 1100.00 WHERE id = 1;

La clause SET reçoit un ou plusieurs couples colonne/valeur séparés par des virgules. La clause WHERE détermine exactement quelles lignes sont affectées par la modification.

Comment mettre à jour une seule colonne en SQL  ?

La table produits contient quatre enregistrements avec les colonnes idnomprixstock et statut. Pour corriger le prix d’un produit précis, on cible sa ligne via son identifiant unique dans la condition WHERE.

idnomprixstockstatut
1Ordinateur1000.0010actif
2Souris25.0050actif
3Clavier80.00150inactif

La requête suivante corrige le prix de l’ordinateur sans toucher aux autres lignes de la table.

UPDATE produits SET prix = 1100.00 WHERE id = 1;
idnomprixstockstatut
1Ordinateur1100.0010actif
2Souris25.0050actif
3Clavier80.00150inactif

Seule la ligne dont id vaut 1 est modifiée, les deux autres restent inchangées. Vérifiez que la condition WHERE cible bien un identifiant unique pour éviter des modifications involontaires.

Peut-on mettre à jour plusieurs colonnes dans une seule instruction UPDATE  ?

Oui, l’instruction SET accepte plusieurs assignations séparées par des virgules dans une seule requête. Cette forme évite d’exécuter plusieurs requêtes successives pour mettre à jour des colonnes liées. Par exemple, corriger le prix et le statut d’un produit se fait en une seule instruction atomique.

Pour activer le clavier et corriger son prix en une opération, on liste les deux colonnes dans SET avec une condition sur le stock.

UPDATE produits SET prix = 90.00, statut = 'actif' WHERE stock > 100;
idnomprixstockstatut
1Ordinateur1100.0010actif
2Souris25.0050actif
3Clavier90.00150actif

Les deux colonnes prix et statut sont mises à jour simultanément sur la ligne dont le stock dépasse 100. Vérifiez que la condition WHERE ne cible pas plus de lignes que prévu avant d’exécuter la requête.

Comment puis-je filtrer des données en SQL avant la mise à jour ?

La condition WHERE contrôle précisément quelles lignes sont affectées par la modification. Il accepte les opérateurs =><LIKEIN et BETWEEN pour des conditions variées. Une condition mal formulée peut toucher des lignes non prévues et corrompre les données.

Les quatre formes suivantes couvrent les cas d’usage les plus courants en production.

-- Cibler un identifiant unique
UPDATE produits SET prix = prix * 1.1 WHERE id = 2;

-- Condition numérique sur le prix
UPDATE produits SET statut = 'en_promo' WHERE prix < 100;

-- Motif textuel avec LIKE
UPDATE produits SET nom = CONCAT(nom, ' Pro') WHERE nom LIKE 'Clavier%';

-- Liste de valeurs avec IN
UPDATE produits SET stock = 0 WHERE id IN (1, 3);
idnomprixstockstatut
1Ordinateur1100.000actif
2Souris27.5050en_promo
3Clavier Pro90.000actif

Chaque condition produit un résultat différent selon les valeurs présentes dans la table. Testez toujours la condition WHERE avec un SELECT identique avant d’exécuter le UPDATE.

Est-il possible d’effectuer une mise à jour avec une jointure en SQL  ?

Oui, UPDATE JOIN synchronise les données entre deux tables liées par une clé commune. Cette syntaxe met à jour une table cible en utilisant les valeurs d’une table source. Par exemple, les prix des produits suivent automatiquement les tarifs mis à jour dans la table fournisseurs.

La table fournisseurs contient le tarif actuel pour chaque fournisseur. La requête suivante applique ce tarif aux produits concernés lorsqu’il est supérieur au prix actuel.

-- MySQL
UPDATE produits p
JOIN fournisseurs f ON p.fournisseur_id = f.id
SET p.prix = f.tarif_actuel
WHERE f.tarif_actuel > p.prix;

-- PostgreSQL
UPDATE produits
SET prix = f.tarif_actuel
FROM fournisseurs f
WHERE produits.fournisseur_id = f.id
  AND f.tarif_actuel > produits.prix;
idnomprixfournisseur_id
1PC1200.0010

Le prix du produit est remplacé par le tarif fournisseur uniquement si ce dernier est plus élevé. Vérifiez que la jointure repose sur une clé commune correctement indexée pour éviter une mise à jour de toutes les lignes.

Comment utiliser la fonction WHEN en SQL ?

CASE WHEN applique un traitement différent à chaque ligne selon ses valeurs, dans une seule requête de mise à jour. Cette forme évite d’exécuter plusieurs requêtes successives pour des règles métier multiples. Par exemple, les prix varient selon le niveau de stock de chaque produit.

La requête suivante applique trois règles tarifaires selon le niveau de stock de chaque produit.

UPDATE produits
SET prix = CASE
    WHEN stock < 10 THEN prix * 1.5
    WHEN stock BETWEEN 10 AND 50 THEN prix * 1.2
    WHEN stock > 50 THEN prix * 0.95
    ELSE prix
END
WHERE stock > 0;
idnomprix avantstockprix après
1PC1200.0051800.00
2Souris25.006023.75

Chaque ligne reçoit un coefficient différent selon sa valeur de stock au moment de l’exécution. Vérifiez que la clause ELSE prix est présente pour ne pas mettre à zéro les lignes qui ne correspondent à aucune condition.

Compatibilité SGBD

FonctionnalitéMySQLPostgreSQLSQL Server
UPDATE JOIN✅ UPDATE t1 JOIN t2✅ UPDATE t1 FROM t2❌ MERGE
LIMIT sur UPDATE✅ LIMIT 100❌ sous-requête✅ TOP(100)
RETURNING✅ RETURNING *✅ OUTPUT
UPSERTON DUPLICATE KEYON CONFLICTMERGE

SQLite supporte UPDATE FROM depuis la version 3.33. Testez toujours la syntaxe sur le SGBD cible avant de déployer en production.

Bonnes pratiques

Règle 1 — Tester avec SELECT avant chaque UPDATE
Exécutez SELECT * FROM produits WHERE condition avec la même condition WHERE avant toute modification pour valider les lignes ciblées.

Règle 2 — Encadrer les UPDATE risqués dans une transaction
START TRANSACTION suivi d’un ROLLBACK annule intégralement les modifications si le résultat ne correspond pas à l’attendu.

Règle 3 — Indexer la colonne utilisée dans WHERE
Un index sur prix ou statut évite un parcours complet de la table et réduit le temps d’exécution sur les grandes tables.

Règle 4 — Limiter les volumes avec LIMIT
Sur les tables de plus de 1 000 lignes, ajoutez LIMIT 1000 pour traiter les modifications par lots et réduire la charge serveur.

Règle 5 — Vérifier le nombre de lignes modifiées avec ROW_COUNT()
Après l’exécution, SELECT ROW_COUNT() retourne le nombre exact de lignes touchées et détecte un UPDATE silencieusement inefficace.

Cas pratique

Un service commercial applique une hausse de 10% sur tous les produits électroniques dont le stock est inférieur à 20 unités, dans le cadre d’une révision tarifaire trimestrielle.

START TRANSACTION;

SELECT * FROM produits
WHERE categorie = 'electronique' AND stock < 20;

UPDATE produits
SET prix = prix * 1.1
WHERE categorie = 'electronique' AND stock < 20;

SELECT ROW_COUNT();

COMMIT;

La transaction protège les données si une erreur survient en cours d’exécution. ROW_COUNT() confirme que le nombre de lignes modifiées correspond au résultat du SELECT préalable.

Erreurs courantes

❌ Erreur : UPDATE sans WHERE
UPDATE produits SET prix = 0;
-- Toutes les lignes de la table sont modifiées.

✅ Correct :
UPDATE produits SET prix = 0 WHERE categorie = 'test';
❌ Erreur : guillemets manquants sur une chaîne
UPDATE produits SET statut = actif WHERE id = 1;
-- Le moteur interprète actif comme un nom de colonne inexistant.

✅ Correct :
UPDATE produits SET statut = 'actif' WHERE id = 1;
❌ Erreur : type de données incompatible
UPDATE produits SET prix = 'cent euros' WHERE id = 2;
-- Une colonne DECIMAL refuse une chaîne de caractères.

✅ Correct :
UPDATE produits SET prix = 100.00 WHERE id = 2;

Sources: Postgresql , MySql