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

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主键,后续调用函数时完全不需要处理主键:

  1. 创建自定义复合类型
CREATE TYPE stuff_insert_param AS (
    "X" TEXT,
    "Y" TEXT
);
  1. 修改函数入参类型为自定义类型的数组
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;
$$;
  1. 调用示例,无需传递主键字段
SELECT up_tbl_variadic(
    ('值X1', '值Y1'),
    ('值X2', '值Y2')
);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 05:27:02