Tema SQL
RETURNING y OUTPUT
Devolver filas afectadas por INSERT, UPDATE o DELETE en la misma sentencia.
Descripción
PostgreSQL (y SQLite) usan RETURNING lista_columnas tras INSERT/UPDATE/DELETE para obtener PK generadas o valores finales sin un SELECT extra. SQL Server usa OUTPUT inserted.* / deleted.* en la misma operación; útil para auditoría y colas.
Estructura general
Forma habitual de la sentencia: orden de cláusulas, qué parte filtra, agrupa o proyecta columnas, y qué devuelve el motor. Cópiala como plantilla y sustituye nombres por tus tablas reales.
-- PostgreSQL
INSERT INTO pedidos (cliente_id, total)
VALUES (1, 99.50)
RETURNING id, creado_en;
-- SQL Server
DELETE FROM carrito
OUTPUT deleted.id, deleted.usuario_id
WHERE expira_en < SYSUTCDATETIME();
Componentes
Cada componente tiene un papel concreto en la ejecución lógica de la sentencia. Léelos en orden: así entiendes qué puedes omitir, qué es obligatorio y qué expresiones son válidas en cada sitio según tu motor.
- RETURNING
- En INSERT devuelve valores materializados (incl. DEFAULT, SERIAL).
- OUTPUT
- inserted y deleted reflejan estado nuevo y anterior según operación.
Ejemplos
Ejemplo 1
UPDATE inventario
SET stock = stock - 1
WHERE sku = 'ABC'
RETURNING sku, stock AS stock_restante;
Ejemplo 2
INSERT INTO log (msg) OUTPUT inserted.id VALUES ('ok'); -- SQL Server
Los ejemplos son ilustrativos. En producción usa consultas parametrizadas (prepared statements), revisa índices y aplica el principio de menor privilegio en cuentas de base de datos.