RDS Postgres 11表序列更新未生效,咨询遗漏操作
问题分析与解决方案
首先你混淆了序列状态的检查方式:currval('table1_id_seq') 返回的是当前会话中最后一次调用nextval()获取到的值,并不代表序列本身的当前实际值。你看到返回6,只是因为当前会话此前调用过nextval()得到了6,setval()操作不会更新currval的结果。
正确检查序列状态的命令
要查看序列的实际当前值和调用状态,执行:
SELECT last_value, is_called FROM table1_id_seq;
last_value:序列当前存储的最大值is_called:若为false,下一次nextval()会直接返回last_value;若为true,则返回last_value + 1
你的命令存在的冗余问题
第一组命令中FROM table1会导致重复执行setval(表有多少行就执行多少次),虽然结果一致但完全没必要,简化为单条查询更高效:
SELECT setval(pg_get_serial_sequence('table1', 'id'), COALESCE((SELECT max(id) FROM table1), 0) + 1, false);
第二组命令里的ALTER TABLE table1 ALTER COLUMN id SET DEFAULT nextval('table1_id_seq');是冗余操作——因为serial4类型创建时已经自动为id列绑定了这个默认值,重复执行不会产生任何变更。
验证变更是否生效
执行完setval后,你可以通过以下方式验证:
- 用上面提到的
SELECT last_value, is_called FROM table1_id_seq;查看序列状态是否符合预期 - 调用一次
nextval()获取下一个序列值,确认是否为你设置的max(id)+1:
SELECT nextval('table1_id_seq');
此时再执行currval('table1_id_seq'),返回的就会是新的序列值了。
内容的提问来源于stack exchange,提问作者Falcon
相关产品推荐
相关产品推荐

