序列(Sequence)的当前值(Currval)无法通过pg_dump导出,又不能对源实例做修改,得这么办才行。
在结构导出时,序列(Sequence)的当前值无法通过pg_dump导出,只能通过事后查询该序列的当前值并写入目标库。
查询序列的当前值,有两种办法:
select currval('seqname')
仅获得当前会话最后一次生成的值。实际执行中,必须先执行nextval后才能执行currval,这样会修改源数据库,不可取select last_value from seqname
获得所有会话中最后一次生成的值
修改目标库序列的当前值,也有两种办法:
select setval('seqname', val)
修改序列当前值(原子操作)alter sequence seqname restart with val
修改序列当前值(阻塞性事务,会阻塞其他会话的nextval操作)
建议采用的方案
既可以干净地获取源值,又能低成本地设置到目标。
select last_value from seqname
获得源库当前值select setval('seqname', val)
在目标库设置目标值