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