給PG數據庫已有表,已存在列添加序列並設置序列當前值爲自增列的最大值

CREATE OR REPLACE FUNCTION "public"."add_sequence_to_table"("p_table_name" text, "p_column_name" text)
  RETURNS "pg_catalog"."void" AS $BODY$
DECLARE
  max_value INTEGER;
  sequence_name text;
BEGIN
  -- 獲取表的最大值
  EXECUTE format('SELECT COALESCE(MAX(%I), 0) FROM %I', p_column_name, p_table_name) INTO max_value;
  
  -- 檢查是否已經存在同名的序列
  SELECT relname INTO sequence_name 
    FROM pg_class WHERE relname = p_table_name || '_' || p_column_name || '_seq';

  IF sequence_name IS NULL THEN
    -- 創建序列
    EXECUTE format('CREATE SEQUENCE %I', p_table_name || '_' || p_column_name || '_seq');
    
    -- 將序列的起始值設置爲當前表的最大值
    EXECUTE format('ALTER SEQUENCE %I RESTART WITH %s', p_table_name || '_' || p_column_name || '_seq', (max_value + 1));
    
    -- 修改列的默認值爲序列的下一個值
    EXECUTE format('ALTER TABLE %I ALTER COLUMN %I SET DEFAULT nextval(%L)', p_table_name, p_column_name, p_table_name || '_' || p_column_name || '_seq');
    
    RAISE NOTICE '成功將自增序列添加到表 % 的列 %,當前值已設置爲 %', p_table_name, p_column_name, (max_value + 1);
  ELSE
    RAISE NOTICE '表 % 的列 % 已存在同名的序列', p_table_name, p_column_name;
  END IF;
END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章