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

