postgresql 重置对应表序列最大值

当使用pg库备份并恢复时,序列的值很可能不会自动更新到最大ID。

原因是,insert语句如果默认写了id,就不会更新序列的值,需要自己拨一下序列的值...

简单来说如下命令就好了,两个your_table 换成你自己的真实表名。

sql 复制代码
SELECT setval('your_table_id_seq', (SELECT MAX(id) FROM your_table));

注:这里 _id_seq 你要看是否和自己的数据库一样,一般默认都用的这个。

然后上面虽然一个表搞定了,但我想对所有表都操作一次,那么使用如下脚本,可以在navicat等工具里直接新建查询,粘贴进去执行一下就好了(实测pg17一次解决)。

复制代码
DO $$
DECLARE
    tab_record RECORD;
    seq_name TEXT;
BEGIN
    FOR tab_record IN 
        SELECT table_name
        FROM information_schema.tables
        WHERE table_schema = 'public'
        AND table_type = 'BASE TABLE'
    LOOP
        -- 直接构建序列名
        seq_name := 'public.' || tab_record.table_name || '_id_seq';
        
        BEGIN
            -- 尝试重置序列
            EXECUTE format('SELECT setval(%L, (SELECT COALESCE(MAX(id), 1) FROM public.%I))', 
                      seq_name, tab_record.table_name);
                      
            RAISE NOTICE '表 % 的序列已更新', tab_record.table_name;
        EXCEPTION WHEN OTHERS THEN
            -- 忽略没有对应序列的表
            RAISE NOTICE '表 % 跳过: %', tab_record.table_name, SQLERRM;
        END;
    END LOOP;
END
$$;
相关推荐
一屉大大大花卷22 分钟前
初识Neo4j之入门介绍(一)
数据库·neo4j
周胡杰1 小时前
鸿蒙arkts使用关系型数据库,使用DB Browser for SQLite连接和查看数据库数据?使用TaskPool进行频繁数据库操作
前端·数据库·华为·harmonyos·鸿蒙·鸿蒙系统
wkj0011 小时前
navicate如何设置数据库引擎
数据库·mysql
赵渝强老师1 小时前
【赵渝强老师】Oracle RMAN的目录数据库
数据库·oracle
暖暖木头1 小时前
Oracle注释详解
数据库·oracle
御控工业物联网1 小时前
御控网关如何实现MQTT、MODBUS、OPCUA、SQL、HTTP之间协议转换
数据库·sql·http
GJCTYU3 小时前
spring中@Transactional注解和事务的实战理解附代码
数据库·spring boot·后端·spring·oracle·mybatis
MicroTech20253 小时前
微算法科技(NASDAQ: MLGO)探索Grover量子搜索算法,利用量子叠加和干涉原理,实现在无序数据库中快速定位目标信息的效果。
数据库·科技·算法
Code季风3 小时前
SQL关键字快速入门:CASE 实现条件逻辑
javascript·数据库·sql
weixin_478689763 小时前
操作系统【2】【内存管理】【虚拟内存】【参考小林code】
数据库·nosql