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
$$;
相关推荐
SAP小崔说事儿3 小时前
在数据库中将字符串拆分成表单(SQL和HANA版本)
java·数据库·sql·sap·hana·字符串拆分·无锡sap
川贝枇杷膏cbppg3 小时前
asmcmd
数据库·oracle
JIngJaneIL4 小时前
基于java+ vue助农电商系统(源码+数据库+文档)
java·开发语言·前端·数据库·vue.js·spring boot·后端
IndulgeCui4 小时前
基于CentOS7 DM8单机部署配置记录-20251216
数据库
surtr14 小时前
关系代数与关系型数据库
数据库·sql·数据库系统
学海_无涯_苦作舟4 小时前
MySQL面试题
数据库·mysql·面试
老邓计算机毕设5 小时前
SSM校内二手书籍交易系统的设计与实现an1k0(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·ssm 框架·ssm 框架开发·ssm 校内二手书籍交易系统
天行健,君子而铎5 小时前
高性能、可控、多架构:教育行业数据库风险监测一体化解决方案
数据库·架构
Stella25215 小时前
实习日志|知识总结
linux·服务器·软件测试·数据库