在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 $$;
