| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152 |
- DO $$
- DECLARE
- seq_record RECORD;
- v_table_name TEXT;
- max_id BIGINT;
- sql_text TEXT;
- BEGIN
- -- 遍历所有public模式下的序列
- FOR seq_record IN SELECT sequencename FROM pg_sequences WHERE schemaname = 'public'
- LOOP
- -- 检查是否为特定序列,需要单独映射
- IF seq_record.sequencename = 'batch_log_id_seq' THEN
- v_table_name := 'batch_log_from_container_log';
- ELSIF seq_record.sequencename = 'batch_log_detail_logs_id_seq' THEN
- v_table_name := 'batch_log_from_container_log_detail_logs';
- ELSE
- -- 从序列名提取表名(假设序列名以_id_seq结尾)
- v_table_name := substring(seq_record.sequencename from '(.*)_id_seq');
- END IF;
-
- -- 如果成功获取表名
- IF v_table_name IS NOT NULL THEN
- -- 检查表是否存在
- IF EXISTS (SELECT 1 FROM information_schema.tables
- WHERE table_schema = 'public' AND table_name = v_table_name) THEN
- BEGIN
- -- 动态查询最大ID值
- EXECUTE 'SELECT COALESCE(MAX(id), 0) + 1 FROM ' || quote_ident(v_table_name) INTO max_id;
-
- -- 生成并执行重置序列的SQL
- sql_text := 'SELECT setval(' || quote_literal(seq_record.sequencename) || ', ' || max_id || ', false);';
- EXECUTE sql_text;
-
- -- 输出成功日志,显示序列名、表名和最大值
- RAISE NOTICE '重置序列: % -> 对应表: % 最大值: %', seq_record.sequencename, v_table_name, max_id;
-
- EXCEPTION WHEN OTHERS THEN
- -- 处理错误情况
- RAISE NOTICE '错误重置序列: % - %', seq_record.sequencename, SQLERRM;
- END;
- ELSE
- -- 输出跳过日志,显示序列名和对应的表名
- RAISE NOTICE '跳过序列: % (对应表 % 不存在)', seq_record.sequencename, v_table_name;
- END IF;
- ELSE
- -- 输出不符合命名约定的日志
- RAISE NOTICE '跳过序列: % (不符合命名约定)', seq_record.sequencename;
- END IF;
- END LOOP;
-
- RAISE NOTICE '序列重置完成';
- END $$;
|