如何在迁移数据库时导出 SEQUENCE
navicat 转储数据和结构 sql 时无法生成自增序列的 sql,但 pgAdmin4 做到了,下面是 pgAdmin 导入和导出 sql 的操作演示:
下面是导入操作:
如何创建 SEQUENCE
- 创建序列:CREATE SEQUENCE my_sequence INCREMENT 1 START 1 MINVALUE 1 MAXVALUE 99999999 CACHE 1;
- 为序列赋予操作权限:ALTER SEQUENCE my_sequence OWNER TO postgres;
- 关联到表主键:alter table my_table alter column my_id set default nextval(‘my_sequence’);
如何正确修改 SEQUENCE
序列(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) 在目标库设置目标值