在 PostgreSQL 中,当你执行一个 UPDATE
或 DELETE
操作时,通常希望获取被修改或删除行的数据。为此,PostgreSQL 提供了一个强大的特性,即使用 RETURNING
子句来返回被影响行的数据。
使用 RETURNING
子句
RETURNING
子句允许你在 UPDATE
或 DELETE
语句中指定一个或多个列,这些列的数据将被返回作为查询结果的一部分。
INSERT
语句使用 RETURNING
在INSERT中,可用于RETURNING的数据是插入时的行。这在简单的插入中不是很有用,因为它只会重复客户机提供的数据。但是,当依赖于计算的默认值时,它可能非常方便。例如,当使用串行列提供唯一标识符时,RETURNING可以返回分配给新行的ID:
CREATE TABLE users (firstname text, lastname text, id serial primary key);
INSERT INTO users (firstname, lastname) VALUES ('Joe', 'Cool') RETURNING id;
The RETURNING clause is also very useful with INSERT … SELECT.
superdb=# insert into employees (name, age) select 'super','30' returning name,age;
name | age
-------+-----
super | 30
(1 row)
示例:UPDATE
语句使用 RETURNING
假设你有一个名为 employees
的表,包含以下列:id
, name
, salary
。你想要更新某个员工的薪水,并同时获取更新后的员工信息。
UPDATE employees
SET salary = salary * 1.1
WHERE id = 1
RETURNING id, name, salary;
这个查询会将 id
为 1 的员工的薪水增加 10%,并返回该员工的 id
, name
, 和更新后的 salary
。
示例:DELETE
语句使用 RETURNING
同样地,如果你想要删除一个员工,并获取被删除员工的信息,你可以这样做:
DELETE FROM employees
WHERE id = 2
RETURNING id, name, salary;
这个查询会删除 id
为 2 的员工,并返回该员工的 id
, name
, 和 salary
。
注意事项
-
性能:虽然
RETURNING
子句非常方便,但在处理大量数据时,它可能会对性能产生影响。在生产环境中使用时,请确保评估其性能影响。 -
事务处理:
RETURNING
子句返回的数据是在事务的上下文中处理的。如果你在一个事务中执行了UPDATE
或DELETE
并使用了RETURNING
,那么返回的数据只有在事务提交后才会被其他事务看到。 -
权限:确保执行
UPDATE
或DELETE
语句的用户有足够的权限访问RETURNING
子句中指定的列。
结论
RETURNING
子句是 PostgreSQL 中一个非常有用的特性,它允许你在执行数据修改操作时直接获取被影响行的数据。这不仅可以简化代码逻辑,还可以提高查询效率。在使用时,请考虑性能影响和事务处理,以确保你的应用程序能够正确、高效地运行。