我有一个insert语句,它可以使用insert语句将单个或多个记录插入到表中。我需要知道每个新行的主id值是什么。
尝试在插入语句中添加以下内容:
RETURNING array_agg(new_seq_id) INTO new_ids
得到以下错误:
[42803] ERROR: aggregate functions are not allowed in RETURNING
是否有一种方法可以将数组转换为所有新序列值的返回语句?
返回新生成的(和实际插入的!)要将数据修改CTE中的id(与其他提供的一样)插入到表中,您需要一个INSERT
语句:
WITH cte AS (
INSERT ...
RETURNING new_seq_id
)
INSERT INTO tbl(new_ids)
SELECT ARRAY(TABLE cte)
TABLE cte
是SELECT * FROM cte
的简写形式。
ARRAY构造函数通常比(更通用的)array_agg()
聚合函数快一点。看到:
- 为什么array_agg()比非聚合ARRAY()构造函数慢?
仅在需要返回单个数组时才有意义。您可以使用RETURNING
子句返回一个集合的行。
是的,您可以使用数据修改CTE。
with t as
(
-- your insert statement
RETURNING new_seq_id
)
select array_agg(new_seq_id) from t into new_ids;
您需要将其封装到一个公共表表达式中:
with new_rows as (
insert into (...)
values (...)
returning new_seq_id
)
select array_agg(new_seq_id)
into new_ids
from new_rows;