6.4. 从修改的行返回数据

有时候在被修改行正在被操纵时从中获取数据是非常有用的。INSERTUPDATE以及DELETE命令都有一个可选的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的另一种常见用法。