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
相关产品推荐
相关产品推荐

