reset.sql 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. DO $$
  2. DECLARE
  3. seq_record RECORD;
  4. v_table_name TEXT;
  5. max_id BIGINT;
  6. sql_text TEXT;
  7. BEGIN
  8. -- 遍历所有public模式下的序列
  9. FOR seq_record IN SELECT sequencename FROM pg_sequences WHERE schemaname = 'public'
  10. LOOP
  11. -- 检查是否为特定序列,需要单独映射
  12. IF seq_record.sequencename = 'batch_log_id_seq' THEN
  13. v_table_name := 'batch_log_from_container_log';
  14. ELSIF seq_record.sequencename = 'batch_log_detail_logs_id_seq' THEN
  15. v_table_name := 'batch_log_from_container_log_detail_logs';
  16. ELSE
  17. -- 从序列名提取表名(假设序列名以_id_seq结尾)
  18. v_table_name := substring(seq_record.sequencename from '(.*)_id_seq');
  19. END IF;
  20. -- 如果成功获取表名
  21. IF v_table_name IS NOT NULL THEN
  22. -- 检查表是否存在
  23. IF EXISTS (SELECT 1 FROM information_schema.tables
  24. WHERE table_schema = 'public' AND table_name = v_table_name) THEN
  25. BEGIN
  26. -- 动态查询最大ID值
  27. EXECUTE 'SELECT COALESCE(MAX(id), 0) + 1 FROM ' || quote_ident(v_table_name) INTO max_id;
  28. -- 生成并执行重置序列的SQL
  29. sql_text := 'SELECT setval(' || quote_literal(seq_record.sequencename) || ', ' || max_id || ', false);';
  30. EXECUTE sql_text;
  31. -- 输出成功日志,显示序列名、表名和最大值
  32. RAISE NOTICE '重置序列: % -> 对应表: % 最大值: %', seq_record.sequencename, v_table_name, max_id;
  33. EXCEPTION WHEN OTHERS THEN
  34. -- 处理错误情况
  35. RAISE NOTICE '错误重置序列: % - %', seq_record.sequencename, SQLERRM;
  36. END;
  37. ELSE
  38. -- 输出跳过日志,显示序列名和对应的表名
  39. RAISE NOTICE '跳过序列: % (对应表 % 不存在)', seq_record.sequencename, v_table_name;
  40. END IF;
  41. ELSE
  42. -- 输出不符合命名约定的日志
  43. RAISE NOTICE '跳过序列: % (不符合命名约定)', seq_record.sequencename;
  44. END IF;
  45. END LOOP;
  46. RAISE NOTICE '序列重置完成';
  47. END $$;