小工具知识网

当前位置: 首页 > 行业知识 > postgresql按日期自动创建分区表

行业知识

postgresql按日期自动创建分区表

2026-11-11 00:58:43 来源:互联网转载

按月自动创建分区表

创建一个函数,该函数包含分区的判断逻辑

CREATE OR REPLACE FUNCTION public.auto_insert_before_table() RETURNS trigger LANGUAGE plpgsqlAS $function$DECLARE    time_column_name     text ;            -- 父表中用于分区的时间字段的名称[必须首先初始化!!]    curMM         varchar(6);        -- 'YYYYMM'字串,用做分区子表的后缀    isExist         boolean;        -- 分区子表,是否已存在    startTime         text;    endTime        text;    strSQL          text;    partitionTableName   text; -- 分区表的完整名称    BEGIN    -- 调用前,必须首先初始化(时间字段名):time_column_name [直接从调用参数中获取!!]    time_column_name := TG_ARGV[0];       -- 判断对应分区表 是否已经存在?    EXECUTE 'SELECT $1.'||time_column_name INTO strSQL USING NEW;    curMM := to_char( strSQL::timestamp , 'YYYYMM' ); -- 构建分区表的名称      partitionTableName := TG_RELNAME || '_' || curMM;             -- 检查分区表是否已存在      SELECT EXISTS(SELECT 1 FROM pg_class WHERE relname = partitionTableName)          INTO isExist;          -- 若不存在, 则插入前需 先创建子分区    IF  not isExist  THEN          -- 创建子分区表        startTime := curMM||'01 00:00:00.000';        endTime := to_char( startTime::timestamp + interval '1 month', 'YYYY-MM-DD HH24:MI:SS.MS');        strSQL := 'CREATE TABLE IF NOT EXISTS '||TG_RELNAME||'_'||curMM||                  ' ( CHECK('||time_column_name||'>='''|| startTime ||''' AND '                             ||time_column_name||' 

创建一个触发器,绑定上述函数

-- time是传参用的,用于函数里面的time_column_nameCREATE TRIGGER insert_table_trigger  BEFORE INSERT  ON `table`  FOR EACH ROW  EXECUTE PROCEDURE auto_insert_before_table('time');

执行insert的语句就会调用触发器,先进行判断是否有time对应的分区表,然后在函数内执行insert语句,如果需要在插入后执行业务代码,则修改RETURN null; 改为RETURN new;


按日自动创建分区表

创建一个函数,该函数包含分区的判断逻辑,此处需要注意curMM的长度,已经变成8位

CREATE OR REPLACE FUNCTION public.auto_insert_demo_tab() RETURNS trigger LANGUAGE plpgsqlAS $function$DECLARE    time_column_name     text ;            -- 父表中用于分区的时间字段的名称[必须首先初始化!!]    curMM         varchar(8);        -- 'YYYYMMdd'字串,用做分区子表的后缀,该长度有8位。    isExist         boolean;        -- 分区子表,是否已存在    startTime         text;    endTime        text;    strSQL          text;     partitionTableName   text; -- 分区表的完整名称    BEGIN    -- 调用前,必须首先初始化(时间字段名):time_column_name [直接从调用参数中获取!!]    time_column_name := TG_ARGV[0];           -- 判断对应分区表 是否已经存在?    EXECUTE 'SELECT $1.'||time_column_name INTO strSQL USING NEW;    curMM := to_char( strSQL::timestamp , 'YYYYMMDD' );             -- 构建分区表的名称      partitionTableName := TG_RELNAME || '_' || curMM;          select count(*) INTO isExist from pg_class where relname = (partitionTableName);     -- 若不存在, 则插入前需 先创建子分区    IF ( isExist = false ) THEN          -- 创建子分区表        startTime := curMM;        endTime := (strSQL::date) + INTERVAL '1 day';                        strSQL := 'CREATE TABLE IF NOT EXISTS '||partitionTableName||                  ' ( CHECK('||time_column_name||'>='''|| startTime ||''' AND '                             ||time_column_name||' 

创建一个触发器,代码同上

()()

上一篇:智慧大屏是如何实现数据可视化的?

下一篇:宝塔面板怎么拓展?