有时候在被修改行正在被操纵时从中获取数据是非常有用的。INSERT
、UPDATE
以及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
的另一种常见用法。