DBAtlas · 数据库运维图谱

返回被修改的行(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 无需单独的 SELECT 即可返回 INSERT/UPDATE/DELETE 所修改行的值(如自动生成的 ID)。在 Oracle 中,单行通过 RETURNING ... INTO 绑定变量返回,多行通过 RETURNING ... BULK COLLECT INTO 集合返回。

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;

PostgreSQL 的 RETURNING 子句非常灵活:它将 INSERT、UPDATE、DELETE 和 MERGE 语句所影响行的任意列(包括计算表达式)直接作为结果集返回。这是获取生成的 serial/identity 值最简洁的方法。

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 不支持标准 RETURNING;INSERT 生成的自增键通过 LAST_INSERT_ID() 获取,更新后的值需通过单独的 SELECT 读取。MariaDB 自 10.5 起提供 INSERT ... RETURNING,自 10.0 起提供 DELETE ... RETURNING。

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;

SQL Server 的等价物是 OUTPUT 子句:它访问 INSERTED(新值)和 DELETED(旧值)伪表;在 UPDATE 中两者都可使用。通过 OUTPUT ... INTO 可将结果写入表/表变量。非常适合将变更复制到审计表。

MongoDB

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

在 MongoDB 中,findOneAndUpdate / findOneAndDelete / findOneAndReplace 命令在单个原子操作中返回受影响的文档。returnDocument: 'before' 返回修改前的版本,'after' 返回修改后的版本。insertOne 返回所插入文档的 _id。

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 没有单独的 RETURNING,但许多写命令会直接返回结果:INCR/INCRBY 返回新值,SET ... GET 返回旧值(GETSET 自 6.2 起已弃用),LPOP/RPOP 返回被移除的元素。对于原子的读写操作,这种行为可替代 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

在 Elasticsearch 中,index/update 操作会返回结果元数据(_id、_version、result)。要获取更新后文档的内容,在 _update 请求中添加 '_source': true;响应的 get 字段包含当前的 _source。无需单独的 GET 调用。

在 DBAtlas 中打开 →