PostgreSQL中插入数据时基于会话生成起始为1的自增序列
PostgreSQL 实现会话级插入序列
需求:通过SELECT查询向另一张表插入数据时,每个会话的序列从1开始、步长1递增;新会话启动后序列重置为1。
方法一:会话级临时序列(推荐)
临时序列是PostgreSQL会话专属对象,会话结束后自动销毁,完美匹配需求:
- 在当前会话中创建临时序列:
CREATE TEMP SEQUENCE session_seq START 1 INCREMENT 1;
- 执行插入操作,调用
nextval()获取序列值:
INSERT INTO target_table (session_seq, col1, col2) SELECT nextval('session_seq'), s.col1, s.col2 FROM source_table s ORDER BY s.id; -- 根据业务需求指定排序,保证序列顺序
- 同一会话内多次插入时,序列会自动连续递增;新会话只需重新执行
CREATE TEMP SEQUENCE语句,序列即从1开始。
方法二:会话变量结合自定义递增
适合简单单次插入场景,需手动维护会话变量:
- 初始化会话级变量:
SET myapp.session_seq = 0;
- 插入时通过变量自增生成序列:
INSERT INTO target_table (session_seq, col1, col2) SELECT (SELECT myapp.session_seq := myapp.session_seq + 1), s.col1, s.col2 FROM source_table s ORDER BY s.id;
- 若同一会话需多次插入,需确保变量持续生效,此方式线程安全性弱于临时序列。
示例效果

内容的提问来源于stack exchange,提问作者Jaswinder Singh
相关产品推荐
相关产品推荐

