首页 > 代码库 > postgresql 分区表

postgresql 分区表

 

1.普通方式建立主表

create table tbl_partition(    id integer,    name varchar(20),    gender boolean,    join_date date,    dept char(4))

2.创建分区表.(注意加上约束和继承)

create table tbl_partition_201211(    check( join_date>=DATE 2012-11-01 and join_date< DATE 2012-12-01 ))inherits(tbl_partition);create table tbl_partition_201212 (check ( join_date >= DATE 2012-12-01 AND join_date < DATE 2013-01-01 )      ) INHERITS (tbl_partition);create table tbl_partition_201301 (check ( join_date >= DATE 2013-01-01 AND join_date < DATE 2013-02-01 )      ) INHERITS (tbl_partition);create table tbl_partition_201302 (check ( join_date >= DATE 2013-02-01 AND join_date < DATE 2013-03-01 )  ) INHERITS (tbl_partition);create table tbl_partition_201303 (check ( join_date >= DATE 2013-03-01 AND join_date < DATE 2013-04-01 ) ) INHERITS (tbl_partition);create table tbl_partition_201304 (check ( join_date >= DATE 2013-04-01 AND join_date < DATE 2013-05-01 )  ) INHERITS (tbl_partition);create table tbl_partition_201305 (check ( join_date >= DATE 2013-05-01 AND join_date < DATE 2013-06-01 )  ) INHERITS (tbl_partition);

 

3.分区表上建立索引.

create index tbl_partition_201211_joindate on tbl_partition_201211 (join_date);create index tbl_partition_201212_joindate on tbl_partition_201212 (join_date); create index tbl_partition_201301_joindate on tbl_partition_201301 (join_date);    create index tbl_partition_201302_joindate on tbl_partition_201302 (join_date); create index tbl_partition_201303_joindate on tbl_partition_201303 (join_date); create index tbl_partition_201304_joindate on tbl_partition_201304 (join_date); create index tbl_partition_201305_joindate on tbl_partition_201305 (join_date); 

 

4.postgresql不能自动插入到字表.所以

要创建触发器函数和创建触发器.这样对外插入就不会有字表的感觉.

触发器函数:

CREATE OR REPLACE FUNCTION tbl_partition_insert_trigger()                      RETURNS TRIGGER AS $$  BEGIN      IF ( NEW.join_date >= DATE 2012-11-01 AND             NEW.join_date < DATE 2012-12-01 ) THEN          INSERT INTO tbl_partition_201211 VALUES (NEW.*);      ELSIF ( NEW.join_date >= DATE 2012-12-01 AND              NEW.join_date < DATE 2013-01-01 ) THEN          INSERT INTO tbl_partition_201212 VALUES (NEW.*);      ELSIF ( NEW.join_date >= DATE 2013-01-01 AND              NEW.join_date < DATE 2013-02-01 ) THEN          INSERT INTO tbl_partition_201301 VALUES (NEW.*);      ELSIF ( NEW.join_date >= DATE 2013-02-01 AND              NEW.join_date < DATE 2013-03-01 ) THEN          INSERT INTO tbl_partition_201302 VALUES (NEW.*);      ELSIF ( NEW.join_date >= DATE 2013-03-01 AND              NEW.join_date < DATE 2013-04-01 ) THEN          INSERT INTO tbl_partition_201303 VALUES (NEW.*);      ELSIF ( NEW.join_date >= DATE 2013-04-01 AND              NEW.join_date < DATE 2013-05-01 ) THEN          INSERT INTO tbl_partition_201304 VALUES (NEW.*);    ELSIF ( NEW.join_date >= DATE 2013-05-01 AND            NEW.join_date < DATE 2013-06-01 ) THEN        INSERT INTO tbl_partition_201305 VALUES (NEW.*);     ELSE          RAISE EXCEPTION Date out of range. Fix the tbl_partition_insert_trigger() function!;      END IF;      RETURN NULL;  END;  $$  LANGUAGE plpgsql;

触发器:

CREATE TRIGGER insert_tbl_partition_traigger    BEFORE INSERT ON tbl_partition    For EACH ROW     EXECUTE PROCEDURE tbl_partition_insert_trigger();

 

 

 

5.插入数据进行测试.

 

insert into tbl_partition values (1, David, 1, 2013-01-10, TS);insert into tbl_partition values (2, Sandy, 0, 2013-02-10, TS);insert into tbl_partition values (3, Eagle, 1, 2012-11-01, TS);insert into tbl_partition values (4, Miles, 1, 2012-12-15, SD);insert into tbl_partition values (5, Simon, 1, 2012-12-10, SD);insert into tbl_partition values (6, Rock, 1, 2012-11-10, SD);insert into tbl_partition values (7, Peter, 1, 2013-01-11, SD);insert into tbl_partition values (8, Sally, 0, 2013-03-10, BCSC);insert into tbl_partition values (9, Carrie, 0, 2013-04-02, BCSC);insert into tbl_partition values (10, Lee, 1, 2013-01-05, BMC);insert into tbl_partition values (11, Nicole, 0, 2012-11-10, PROJ);insert into tbl_partition values (12, Renee, 0, 2013-01-10, TS);

 

 

另: 解除分区方法:

alter table tbl_partition_201304 no inherit tbl_partition;

  增加分区:

 

 

参考:

PostgreSQL官方说明:http://www.postgresql.org/docs/9.2/static/ddl-partitioning.html

ITEYE:http://diegoball.iteye.com/blog/713826

kenyon(君羊):http://my.oschina.net/Kenyon/blog/59455

博客园:http://www.cnblogs.com/mchina/archive/2013/04/09/2973427.html