ON CONFLICT et RETURNING

Insérer une ligne ou mettre à jour la ligne existante (upsert), et récupérer les lignes modifiées.

Syntaxe

INSERT INTO table VALUES (…) ON CONFLICT (key) DO UPDATE SET column = EXCLUDED.column;
INSERT … ON CONFLICT DO NOTHING;
UPDATE … RETURNING column_list;
  • EXCLUDED contient la ligne que vous avez tenté d'insérer.
  • Autres bases de données : MySQL ON DUPLICATE KEY UPDATE, SQL Server et Oracle MERGE.

Exemple

SELECT product_id, name FROM products WHERE product_id = 3;

Le produit 3 existe déjà : un upsert avec la clé 3 le mettrait donc à jour au lieu d'échouer.

Tables utilisées : products. Essayez-le dans une leçon ci-dessous.

Erreurs courantes

  • ON CONFLICT exige une contrainte d'unicité ou une clé primaire sur les colonnes que vous indiquez.
  • RETURNING est propre à PostgreSQL (et à SQLite, MariaDB) ; SQL Server utilise OUTPUT.

Pratiquer