Postgres表分区
通过触发器与函数建立分区
CREATE OR REPLACE FUNCTION create_table_partition () RETURNS TRIGGER AS $BODY$
DECLARE
date_time TEXT;
insert_sql TEXT;
create_sql TEXT;
BEGIN
-- NEW为新加入的record,可以由其索引各个字段
SELECT to_char( NEW.operation_time, 'YYYY_MM' ) INTO date_time;
insert_sql := 'insert into Test.test1_' || date_time || ' VALUES ($1.*)' ;
EXECUTE insert_sql USING NEW;
RETURN NULL;
-- 当无对应分区表时,捕捉到如下异常,将会新建table
EXCEPTION
WHEN UNDEFINED_TABLE THEN
-- inherits 集成之前表格所有的内容
create_sql := 'create table if not exists Test.test1_' || date_time || '() inherits (Test.test1)';
EXECUTE create_sql;
EXECUTE insert_sql USING NEW;
RETURN NULL;
END;
$BODY$
LANGUAGE'plpgsql';
-- 触发器,每次新增字段时会触发该函数新增分区
CREATE TRIGGER create_table_partition_trigger BEFORE INSERT ON Test.test1 FOR EACH ROW EXECUTE PROCEDURE create_table_partition ();
修改table(比如新增字段)后分区表随着新增字段
如下新增字段:
ALTER TABLE Test.test1 ADD COLUMN "user_append" varchar(255);
COMMENT ON COLUMN "Test"."test1"."user_append" IS '用户新增角色';
所有的分区表都会新增字段。