如何使用DMS迁移后重置PostgreSQL中的序列
批量重置PostgreSQL序列的高效方案
针对AWS DMS迁移后大量带序列表的重置需求,直接利用PostgreSQL系统表生成批量执行脚本是最优解,无需手动逐个处理。
方法1:生成批量重置命令
执行以下SQL查询,会自动生成所有目标schema下关联主键的序列重置语句:
SELECT format( 'ALTER SEQUENCE %I.%I RESTART WITH %s;', seq_schema, seq_name, COALESCE(max_id, 0) + 1 ) AS reset_command FROM ( SELECT n.nspname AS seq_schema, c.relname AS seq_name, (SELECT COALESCE(max(t.%I), 0) FROM ONLY %I.%I t) AS max_id FROM pg_depend d JOIN pg_class c ON d.objid = c.oid JOIN pg_namespace n ON c.relnamespace = n.oid JOIN pg_attribute a ON d.refobjid = a.attrelid AND d.refobjsubid = a.attnum JOIN pg_class t ON a.attrelid = t.oid JOIN pg_namespace tn ON t.relnamespace = tn.oid WHERE c.relkind = 'S' AND d.deptype = 'a' -- 指定需要处理的schema,比如你的habit库 AND tn.nspname = 'habit' ) AS seq_info WHERE max_id IS NOT NULL;
执行后会得到一列reset_command,将这些命令复制到SQL客户端批量执行即可。
方法2:一步到位自动执行(适用于psql客户端)
如果使用psql连接目标数据库,可直接用\gexec命令让查询结果自动作为SQL执行,省去复制步骤:
SELECT format( 'ALTER SEQUENCE %I.%I RESTART WITH %s;', n.nspname, c.relname, COALESCE((SELECT max(t.%I) FROM ONLY %I.%I t), 0) + 1 ) FROM pg_depend d JOIN pg_class c ON d.objid = c.oid JOIN pg_namespace n ON c.relnamespace = n.oid JOIN pg_attribute a ON d.refobjid = a.attrelid AND d.refobjsubid = a.attnum JOIN pg_class t ON a.attrelid = t.oid JOIN pg_namespace tn ON t.relnamespace = tn.oid WHERE c.relkind = 'S' AND d.deptype = 'a' AND tn.nspname = 'habit' \gexec
关键说明
- 脚本会自动关联序列与对应表的主键字段,计算主键最大值并将序列重置为
max(id)+1,空表会重置为1,符合默认序列起始逻辑。 - 若需处理多个schema,删除
AND tn.nspname = 'habit'条件即可。 - 确保执行账号拥有
ALTER SEQUENCE的权限。
内容的提问来源于stack exchange,提问作者Juvette M
相关产品推荐
相关产品推荐

