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.