You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PostgreSQL函数插入多行后如何返回新生成的ID数组?

如何在PostgreSQL函数中返回插入多行的所有ID数组?

嘿,我懂你碰到的问题了——你写了个PL/pgSQL函数批量插数据,想返回所有新插入行的ID,但调用时触发了“返回多行”的错误。这是因为你原来的写法里,RETURNING id INTO company_ids_list只能处理单行结果,当INSERT一次性生成多行时,PostgreSQL没法直接把多个ID塞进数组变量里。

咱们来调整下这个函数,让它正确收集所有插入的ID:

CREATE OR REPLACE FUNCTION insert_multiple_rows(temp integer) 
RETURNS integer[] 
LANGUAGE plpgsql 
VOLATILE PARALLEL UNSAFE COST 100 
AS $BODY$
DECLARE 
    company_ids_list integer[];
BEGIN
    -- 用子查询把插入返回的所有ID聚合为数组,再赋值给变量
    SELECT array_agg(id) INTO company_ids_list
    FROM (
        INSERT INTO company VALUES 
            (default, now(), temp), 
            (default, now(), temp), 
            (default, now(), temp), 
            (default, now(), temp)
        RETURNING id
    ) AS inserted_rows;

    RETURN company_ids_list;
END;
$BODY$;

改动说明:

  • 原来的RETURNING id INTO直接赋值会因为多行结果报错,现在我们把INSERT语句放在子查询里,用array_agg(id)把所有返回的ID聚合为一个整数数组,再赋值给company_ids_list变量。
  • 这样不管你插入多少行,都能把所有新生成的ID打包成数组返回。

现在再调用select insert_multiple_rows(58);,就能得到类似{101,102,103,104}这样的结果,包含所有插入行的ID了。

另外补充一句:如果你的company表的id是自增主键(比如serial或者GENERATED AS IDENTITY类型),那用default来自动生成ID的写法是完全正确的,不用调整。

内容的提问来源于stack exchange,提问作者Somil

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:39:57