Postgresql 中文操作指南

6.4. Returning Data from Modified Rows #

有时获取修改行中的数据很有用,而这些数据正在被处理。INSERTUPDATEDELETE 命令都有一个可选的 RETURNING 子句来支持此功能。使用 RETURNING 避免执行额外的数据库查询来收集数据,尤其当无法可靠地识别已修改的行时,这尤其有价值。

RETURNING 条款允许的内容与 SELECT 命令的输出列表相同(请参见 Section 7.3)。它可以包含命令目标表的列名,或使用这些列的值表达式。RETURNING * 是一个常用的简写,它按顺序选择目标表的全部列。

INSERT 中,可供 RETURNING 使用的数据是按插入时的行。在简单的插入中没有那么有用,因为它只会重复客户端提供的数据。但在依赖于计算默认值时却非常方便。例如,当使用 serial 列提供唯一标识符时, RETURNING 可以返回分配给新行的 ID:

CREATE TABLE users (firstname text, lastname text, id serial primary key);

INSERT INTO users (firstname, lastname) VALUES ('Joe', 'Cool') RETURNING id;

RETURNING 子句也可以与 INSERT …​ SELECT 一起使用。

UPDATE 中,RETURNING 可用的数据是已修改行的新的内容。例如:

UPDATE products SET price = price * 1.10
  WHERE price <= 99.99
  RETURNING name, price AS new_price;

DELETE 中,RETURNING 可用的数据是已删除行的内容。例如:

DELETE FROM products
  WHERE obsoletion_date = 'today'
  RETURNING *;

如果目标表上有触发器 ( Chapter 39),那么 RETURNING 能够获取的数据就是触发器修改后的行。因此,检查由触发器计算得出的列是 RETURNING 的另一个常见用例。