ON CONFLICT y RETURNING

Inserta una fila o actualiza la existente (upsert), y devuelve las filas que cambiaron.

Sintaxis

INSERT INTO table VALUES (…) ON CONFLICT (key) DO UPDATE SET column = EXCLUDED.column;
INSERT … ON CONFLICT DO NOTHING;
UPDATE … RETURNING column_list;
  • EXCLUDED contiene la fila que intentaste insertar.
  • Otras bases de datos: MySQL usa ON DUPLICATE KEY UPDATE; SQL Server y Oracle usan MERGE.

Ejemplo

SELECT product_id, name FROM products WHERE product_id = 3;

El producto 3 ya existe, así que un upsert con la clave 3 lo actualizaría en lugar de fallar.

Tablas usadas: products. Pruébalo en una lección de abajo.

Errores comunes

  • ON CONFLICT necesita una restricción única o una clave primaria sobre las columnas que nombras.
  • RETURNING es de PostgreSQL (y de SQLite y MariaDB); SQL Server usa OUTPUT.

Practícalo