当使用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
$$;