MERGE
PostgreSQL 🔴 SeniorDéfinition
Commande introduite dans PostgreSQL 15 (2022) qui combine INSERT, UPDATE et DELETE en une seule instruction conditionnelle via des clauses WHEN MATCHED / WHEN NOT MATCHED. PostgreSQL 17 (26 septembre 2024) y ajoute WHEN NOT MATCHED BY SOURCE et le support de RETURNING avec la fonction merge_action().
Analogie
Comme trier un stock en une seule passe : ce qui existe déjà est mis a jour, ce qui est nouveau est ajoute, ce qui a disparu est retire.
Exemple de code
MERGE INTO stock s
USING deliveries d ON d.sku = s.sku
WHEN MATCHED THEN
UPDATE SET qty = s.qty + d.qty
WHEN NOT MATCHED THEN
INSERT (sku, qty) VALUES (d.sku, d.qty)
WHEN NOT MATCHED BY SOURCE THEN
DELETE
RETURNING merge_action(), s.sku;
Cas d'usage
Synchroniser une table cible avec une source (upsert + suppression) en une seule requête atomique.
Anti-pattern
Utiliser MERGE sur une vue matérialisée ou une table distante (foreign table) : non supporte.
Termes liés
Fiche mise à jour le 2026-09-27