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

PostgreSQL中不使用nextval()从序列获取ID的方法

问题分析与解决办法

你的问题根源很明确:创建序列时设置了INCREMENT BY 50,这就指定了每次调用nextval()时序列值会增加50,所以得到1、51是完全符合序列配置的正常结果,不是函数的问题。

解决步骤

1. 修正序列步长(获取连续ID的核心)

如果需要连续递增的ID,把序列的步长改成1即可:

ALTER SEQUENCE user_seq INCREMENT BY 1;

之后再执行nextval('user_seq'),就会得到1、2、3这样的连续值。

2. 让ID字段自动使用序列(更省心的写法)

如果不想每次插入都手动写nextval('user_seq'),可以把序列和user_id字段关联,设置默认值:

ALTER TABLE users ALTER COLUMN user_id SET DEFAULT nextval('user_seq');

之后插入数据时可以省略user_id的赋值,数据库会自动帮你生成:

INSERT INTO users (user_firstname, user_lastname, user_nickname, user_email, user_password, user_role)
VALUES 
 ('First Name', 'First Lastname', 'First Nickname', 'first@email.gg', 'First pass', 'USER_PRESENTER'),
 ('Second Name', 'Second Lastname', 'Second Nickname', 'second@email.gg', 'Second pass', 'USER_ELECTOR')
RETURNING *;

3. 关于pg_get_serial_sequence()的报错问题

这个函数是用来获取SERIAL/BIGSERIAL类型字段对应的系统序列名的,你的user_id是手动创建的BIGINT字段+手动序列,没有用SERIAL语法,所以直接调用会报错。如果要手动关联后使用,得先确保字段和序列关联,或者直接用你自己定义的序列名user_seq即可,没必要用这个函数。

4. 关于currval()的说明

currval()只能获取当前会话中已经调用过nextval的序列的当前值,它不能帮你生成新的连续ID,所以对你的需求来说没用。比如你调用一次nextval得到1,再调用currval还是1,但下一个nextval还是会按步长走,步长不对的话依然跳号。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 00:26:12