从修改的行中返回数据 ========================= 有时在修改行的操作过程中获取数据很有用。\ ``INSERT``\ 、 ``UPDATE``\ 和\ ``DELETE``\ 命令都有一个支持这个的可选的 ``RETURNING``\ 子句。使用\ ``RETURNING`` 可以避免执行额外的数据库查询来收集数据,并且在否则难以可靠地识别修改的行时尤其有用。 所允许的\ ``RETURNING``\ 子句的内容与\ ``SELECT``\ 命令的输出列表相同 (请参阅\ `第 7.3 节 `__\ )。它可以包含命令的目标表的列名, 或者包含使用这些列的值表达式。一个常见的简写是\ ``RETURNING *``\ , 它按顺序选择目标表的所有列。 在\ ``INSERT``\ 中,可用于\ ``RETURNING``\ 的数据是插入的行。 这在琐碎的插入中并不是很有用,因为它只会重复客户端提供的数据。 但依赖于计算出的默认值时可以非常方便。例如,当使用 ```serial`` `__\ 列来提供唯一标识符时, ``RETURNING``\ 可以返回分配给新行的ID: .. code:: programlisting 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``\ 的数据是被修改行的新内容。 例如: .. code:: programlisting UPDATE products SET price = price * 1.10 WHERE price <= 99.99 RETURNING name, price AS new_price; 在\ ``DELETE``\ 中,可用于\ ``RETURNING``\ 的数据是删除行的内容。例如: .. code:: programlisting DELETE FROM products WHERE obsoletion_date = 'today' RETURNING *; 如果目标表上有触发器,可用于\ ``RETURNING`` 的数据是被触发器修改的行。因此,检查由触发器计算的列是 ``RETURNING``\ 的另一个常见用例。