Postgres可变参数函数批量插入多行时规避主键参数要求的方法咨询
解决方案
你当前使用表类型stuff[]作为入参时,该类型默认包含表的全部字段,因此构造数组元素时必须给主键赋值,以下是两种可行的实现方案:
方案一:最小改动,调用时主动给主键传NULL
你的主键定义为GENERATED BY DEFAULT AS IDENTITY,传入NULL值时数据库会自动生成主键序列值,不需要修改现有函数,仅调整调用方式即可:
-- 调用示例:第一个位置对应id字段,传入NULL即可 SELECT up_tbl_variadic( (NULL, '值X1', '值Y1')::stuff, (NULL, '值X2', '值Y2')::stuff );
注意:如果主键定义为GENERATED ALWAYS AS IDENTITY,该方案会触发报错,需使用方案二
方案二:自定义仅包含插入字段的复合类型(推荐)
你可以自定义专属复合类型,仅保留需要传入的X、Y字段,无需包含id主键,后续调用函数时完全不需要处理主键:
- 创建自定义复合类型
CREATE TYPE stuff_insert_param AS ( "X" TEXT, "Y" TEXT );
- 修改函数入参类型为自定义类型的数组
CREATE OR REPLACE FUNCTION up_tbl_variadic(VARIADIC _stuff_array stuff_insert_param[]) RETURNS void LANGUAGE plpgsql AS $$ BEGIN INSERT INTO stuff ("X", "Y") SELECT "X", "Y" FROM unnest(_stuff_array); END; $$;
- 调用示例,无需传递主键字段
SELECT up_tbl_variadic( ('值X1', '值Y1'), ('值X2', '值Y2') );
内容的提问来源于stack exchange,提问作者user973347
相关产品推荐
相关产品推荐

