PostgreSQL 一键批量修复所有表序列值

在navcat 等工具控制台执行下面命令

bash 复制代码
DO $$
DECLARE
    tbl_name TEXT;
    seq_name TEXT;
    max_id BIGINT;
BEGIN
    -- 遍历 public 模式下的所有用户表
    FOR tbl_name IN
        SELECT tablename
        FROM pg_tables
        WHERE schemaname = 'public'
        AND tablename NOT LIKE 'pg_%'
    LOOP
        seq_name := tbl_name || '_seq';

        BEGIN
            -- 1. 获取表中 id 的最大值,若表为空则为 0
            EXECUTE format(
                'SELECT COALESCE(MAX(id), 0) FROM %I',
                tbl_name
            ) INTO max_id;

            -- 2. 直接修复序列值
            -- setval(seq, val, true) 表示序列当前值为 val,下次 nextval() 返回 val + 1
            EXECUTE format(
                'SELECT setval(%L, %s, true)',
                seq_name,
                max_id
            );

            RAISE NOTICE '已修复序列: % (下一值: %)', seq_name, max_id + 1;

        EXCEPTION WHEN OTHERS THEN
            -- 忽略没有 id 列或序列不存在的表,继续处理下一个
            RAISE WARNING '跳过表 %: %', tbl_name, SQLERRM;
        END;
    END LOOP;
END $$;