PostgreSQL 修改序列

时间:2024-11-14 07:23:35

ALTER SEQUENCE public.pitr_test_id_seq CACHE XXXXX;
SELECT nextval('pitr_test_id_seq');
SELECT setval('pitr_test_id_seq', 42);            下一次 nextval 会返回 43
SELECT setval('pitr_test_id_seq', 42, true);     同上
SELECT setval('pitr_test_id_seq', 42, false);    下一次 nextval 将返回 42

currval(pitr_test_id_seq)    返回最近一次用 nextval 获取的指定序列的值
lastval()    返回最近一次用 nextval 获取的任何序列的值
nextval(pitr_test_id_seq)    递增序列并返回新值
setval(pitr_test_id_seq, bigint)    设置序列的当前值
setval(pitr_test_id_seq, bigint, boolean)    设置序列的当前值以及 is_called 标志

备注:这里 CACHE 如果过大会造成表类似锁表状态,但是和锁表又有非常大的区别。遇到问题的时候就算重启服务都无法解决。
有一次我们一个研发写了一个 ALTER SEQUENCE public.xxx_seq CACHE 1731506966603517955;
最后问题还是通过解析日志才找到的。然后再通过模拟多个 SESSION 进行请求。

这里的 cache 是这个意思,一次性预先分配指定数量的序列值,然后将其存储在内存中,以便能尽快被会话使用。
The clause CACHE cache enables sequence numbers to be preallocated and stored in memory for faster access.

这里进程还不能通过调用 pg_terminate_backend 来实现关闭进程的操作。

单独执行语句 ALTER SEQUENCE public.pitr_test_id_seq CACHE XXXXX; 不会有问题,但是在执行完这个语句之后,使用 select nextval('pitr_test_id_seq'); 来获取序列的下一个键值无法被运行,会一直处于等待的状态。还是需要从操作系统的层面进行 kill -9 select nextval('pitr_test_id_seq'); 进程的 PID,然后再执行 ALTER SEQUENCE public.pitr_test_id_seq CACHE 1;  这里的 CACHE 的值就是 1。