DBAtlas · Atlas de operaciones de bases de datos

Devolver la fila modificada (RETURNING / OUTPUT)

Oracle

-- Single row: RETURNING ... INTO (PL/SQL bind variable)
UPDATE employee SET salary = salary * 1.1
WHERE id = 5
RETURNING salary INTO :new_salary;

-- Get back the key generated by an INSERT
INSERT INTO employee (name) VALUES ('Ayse')
RETURNING id INTO :new_id;

RETURNING devuelve los valores de las filas modificadas por INSERT/UPDATE/DELETE (p. ej., un ID autogenerado) sin un SELECT aparte. En Oracle, una sola fila se devuelve con RETURNING ... INTO en una variable bind, y varias filas con RETURNING ... BULK COLLECT INTO en una colección.

PostgreSQL

INSERT INTO employee (name, salary)
VALUES ('Ayse', 15000)
RETURNING id, name;

UPDATE employee SET salary = salary * 1.1
WHERE department = 'IT'
RETURNING id, salary;

La cláusula RETURNING de PostgreSQL es muy flexible: devuelve directamente como conjunto de resultados cualquier columna (incluidas expresiones calculadas) de las filas afectadas por las sentencias INSERT, UPDATE, DELETE y MERGE. Es la forma más limpia de obtener los valores serial/identity generados.

MySQL

-- MySQL has no RETURNING; the generated key is retrieved separately:
INSERT INTO employee (name, salary) VALUES ('Ayse', 15000);
SELECT LAST_INSERT_ID();

-- MariaDB 10.5+ supports INSERT ... RETURNING:
INSERT INTO employee (name) VALUES ('Ayse') RETURNING id;

MySQL no admite el RETURNING estándar; la clave autoincremental generada por un INSERT se obtiene con LAST_INSERT_ID(), y los valores actualizados se leen con un SELECT aparte. MariaDB ofrece INSERT ... RETURNING desde 10.5 y DELETE ... RETURNING desde 10.0.

SQL Server

INSERT INTO employee (name, salary)
OUTPUT INSERTED.id, INSERTED.name
VALUES ('Ayse', 15000);

UPDATE employee SET salary = salary * 1.1
OUTPUT DELETED.salary AS old_salary, INSERTED.salary AS new_salary
WHERE id = 5;

El equivalente en SQL Server es la cláusula OUTPUT: accede a las pseudotablas INSERTED (valores nuevos) y DELETED (valores antiguos); ambas pueden usarse en un UPDATE. Con OUTPUT ... INTO los resultados se pueden escribir en una tabla/variable de tabla. Ideal para copiar los cambios en una tabla de auditoría.

MongoDB

// findOneAndUpdate returns the modified document
db.employee.findOneAndUpdate(
  { id: 5 },
  { $mul: { salary: 1.1 } },
  { returnDocument: "after" }   // return the updated version
)

En MongoDB, los comandos findOneAndUpdate / findOneAndDelete / findOneAndReplace devuelven el documento afectado en una única operación atómica. returnDocument: 'before' da la versión anterior al cambio y 'after' la posterior. insertOne devuelve el _id del documento insertado.

Redis

# Some commands return the old/new value directly:
SET counter 0 GET       # (6.2+) returns the old value and writes the new one (replaces GETSET)
INCR visits          # increments and returns the new value

Redis no tiene un RETURNING aparte, pero muchos comandos de escritura devuelven el resultado directamente: INCR/INCRBY devuelven el nuevo valor, SET ... GET el valor antiguo (GETSET está obsoleto desde 6.2) y LPOP/RPOP el elemento extraído. Para lectura-escritura atómica, este comportamiento sustituye a RETURNING.

Elasticsearch

# The _update response can return the result:
POST employee/_update/5
{
  "script": { "source": "ctx._source.salary *= 1.1" },
  "_source": true
}
# The response returns the updated document in get._source

En Elasticsearch, las operaciones index/update devuelven metadatos del resultado (_id, _version, result). Para obtener el cuerpo del documento actualizado, añada '_source': true a la solicitud _update; el campo get de la respuesta contiene el _source actual. No se necesita una llamada GET aparte.

Abrir en DBAtlas →