返回插入的序列值的数组



我有一个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 cteSELECT * 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;