You need to enable JavaScript to run this app. PostgreSQL批量插入百万记录时如何生成带固定前缀的递增序列值
优惠活动
大模型
产品
解决方案
定价
更多

PostgreSQL批量插入百万记录时如何生成带固定前缀的递增序列值

PostgreSQL批量插入时两列固定前缀+递增数字的实现逻辑

你当前编写的查询已经通过generate_series生成连续整数序列,可直接复用该序列返回的整数值完成两列的赋值,无需额外创建独立序列对象或编写复杂存储过程。

核心逻辑说明

  • generate_series(起始值, 总条数) s(i)返回的列i本身就是逐次递增的连续整数,直接与要求的固定文本做字符串拼接即可满足需求
  • PostgreSQL 中字符串拼接可直接使用||运算符完成
  • 原查询存在几处会导致执行报错的细节问题,需一并修正:
    • 原代码中赋值给pxcreateoperator、pxcreateopname的test未加单引号,会被数据库识别为不存在的列
    • 原代码中给passengerage赋值的截取4位md5字符串,无法直接写入整数类型的年龄字段,需补充类型转换

完整可运行示例代码

将原查询中注释占位的两列替换为拼接逻辑,调整generate_series的参数到百万规模即可:

INSERT INTO testable (
    pxcommitdatetime,
    pxsavedatetime,
    pxcreatedatetime,
    pxcreateoperator,
    pxcreateopname,
    pxinsname,
    key,
    tripname,
    source,
    destination,
    passengername,
    passengerage
)
SELECT
    CURRENT_TIMESTAMP,
    CURRENT_TIMESTAMP,
    CURRENT_TIMESTAMP,
    'test',
    'test',
    -- pxinsname列:固定前缀S-拼接递增数字
    'S-' || s.i,
    -- key列:固定前缀"ABC S"拼接递增数字
    'ABC S ' || s.i,
    md5(random()::text),
    md5(random()::text),
    md5(random()::text),
    md5(random()::text),
    -- 将截取的4位字符转成整数作为年龄值
    left(md5(random()::text), 4)::INT
-- 生成1到1000000的连续序列,对应百万条记录
FROM generate_series(1, 1000000) s(i);

实操调整建议

  • 若需要调整递增数字的起始值,直接修改generate_series的第一个参数即可,比如需要从100001开始递增,直接写为generate_series(100001, 1100000),两个目标列的拼接值会同步跟随序列变化
  • 若需要拼接后的数字保持固定长度(不足位前面补0),可搭配lpad函数处理,示例为'S-' || lpad(s.i::text, 6, '0'),最终会生成类似S-000001的固定格式值
  • 百万条规模的单次插入会产生较大的事务日志开销,建议拆分为每批1-2万条的分批插入,避免长事务阻塞正常业务读写

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.22 17:45:02