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

