建立分区表需要的几个步骤:

(代码为网上借阅)

 1.建立主表

 

create table parent_table(

        id int,

        name character varying(20),

        create_time timestamp without time zone);

2.建立子表,继承于主表

 

create table parent_table_2012_01(

check (create_time>=date '2012-01-01' and create_time<date '2012-02-01'))

inherits(parent_table); 

 

create table parent_table_2012_02(

check (create_time>=date '2012-02-01' and create_time<date '2012-03-01'))

inherits(parent_table);

 

create table parent_table_2012_03(

check (create_time>=date '2012-03-01' and create_time<date '2012-04-01'))

inherits(parent_table);

 

create table parent_table_2012_04(

check (create_time>=date '2012-04-01' and create_time<date '2012-05-01'))

inherits(parent_table);

 

create table parent_table_2012_05(

check (create_time>=date '2012-05-01' and create_time<date '2012-06-01'))

inherits(parent_table);

 

create table parent_table_2012_06(

check (create_time>=date '2012-06-01' and create_time<date '2012-07-01'))

inherits(parent_table);

 

create table parent_table_2012_07(

check (create_time>=date '2012-07-01' and create_time<date '2012-08-01'))

inherits(parent_table);

 

create table parent_table_2012_08(

check (create_time>=date '2012-08-01' and create_time<date '2012-09-01'))

inherits(parent_table);

 

 

create table parent_table_2012_09(

check (create_time>=date '2012-09-01' and create_time<date '2012-10-01'))

inherits(parent_table);

 

create table parent_table_2012_10(

check (create_time>=date '2012-10-01' and create_time<date '2012-11-01'))

inherits(parent_table);   

 

create table parent_table_2012_11(

check (create_time>=date '2012-11-01' and create_time<date '2012-12-01'))

inherits(parent_table);

 

create table parent_table_2012_12(

check (create_time>=date '2012-12-01' and create_time<date '2013-01-01'))

inherits(parent_table);

 

3.创建触发器函数(这里都是写死的,时间得写的长一点)

 

CREATE OR REPLACE FUNCTION test.tri_parent_tab_insert()   

 

RETURNS TRIGGER AS $$   

 

--author: kenyon

 

--created:2012-05-24

 

BEGIN  

 

    IF ( NEW.create_time >= DATE '2012-01-01' AND  

 

         NEW.create_time < DATE '2012-02-01' ) THEN  

 

        INSERT INTO test.parent_table_2012_01 VALUES (NEW.id,NEW.name,NEW.create_time);   

 

    ELSIF ( NEW.create_time >= DATE '2012-02-01' AND  

 

            NEW.create_time < DATE '2012-03-01' ) THEN  

 

        INSERT INTO test.parent_table_2012_02 VALUES (NEW.id,NEW.name,NEW.create_time);     

 

    ELSIF ( NEW.create_time >= DATE '2012-03-01' AND  

 

            NEW.create_time < DATE '2012-04-01' ) THEN  

 

        INSERT INTO test.parent_table_2012_03 VALUES (NEW.id,NEW.name,NEW.create_time);   

 

    ELSIF ( NEW.create_time >= DATE '2012-04-01' AND  

 

            NEW.create_time < DATE '2012-05-01' ) THEN  

 

        INSERT INTO test.parent_table_2012_04 VALUES (NEW.id,NEW.name,NEW.create_time);   

 

    ELSIF ( NEW.create_time >= DATE '2012-05-01' AND  

 

            NEW.create_time < DATE '2012-06-01' ) THEN  

 

        INSERT INTO test.parent_table_2012_05 VALUES (NEW.id,NEW.name,NEW.create_time);   

 

    ELSIF ( NEW.create_time >= DATE '2012-06-01' AND  

 

            NEW.create_time < DATE '2012-07-01' ) THEN  

 

        INSERT INTO test.parent_table_2012_06 VALUES (NEW.id,NEW.name,NEW.create_time);   

 

    ELSIF ( NEW.create_time >= DATE '2012-07-01' AND  

 

            NEW.create_time < DATE '2012-08-01' ) THEN  

 

        INSERT INTO test.parent_table_2012_07 VALUES (NEW.id,NEW.name,NEW.create_time);   

 

    ELSIF ( NEW.create_time >= DATE '2012-08-01' AND  

 

            NEW.create_time < DATE '2012-09-01' ) THEN  

 

        INSERT INTO test.parent_table_2012_08 VALUES (NEW.id,NEW.name,NEW.create_time);   

 

    ELSIF ( NEW.create_time >= DATE '2012-09-01' AND  

 

            NEW.create_time < DATE '2012-10-01' ) THEN  

 

        INSERT INTO test.parent_table_2012_09 VALUES (NEW.id,NEW.name,NEW.create_time);   

 

    ELSIF ( NEW.create_time >= DATE '2012-10-01' AND  

 

            NEW.create_time < DATE '2012-11-01' ) THEN  

 

        INSERT INTO test.parent_table_2012_10 VALUES (NEW.id,NEW.name,NEW.create_time);   

 

    ELSIF ( NEW.create_time >= DATE '2012-11-01' AND  

 

            NEW.create_time < DATE '2012-12-01' ) THEN  

 

        INSERT INTO test.parent_table_2012_11 VALUES (NEW.id,NEW.name,NEW.create_time);     

 

    ELSIF ( NEW.create_time >= DATE '2012-12-01' AND  

 

            NEW.create_time < DATE '2013-01-01' ) THEN  

 

        INSERT INTO test.parent_table_2012_12 VALUES (NEW.id,NEW.name,NEW.create_time);   

 

    ELSE  

 

        RAISE EXCEPTION 'Date out of range.Fix the test.parent_table_insert_trigger() function!';   

 

    END IF;   

 

    RETURN NULL;   

 

END;   

 

$$   

 

LANGUAGE plpgsql; 
 

4.创建触发器

 

CREATE TRIGGER tri_insert_parent_table  

 

    BEFORE INSERT ON test.parent_table   

 

    FOR EACH ROW EXECUTE PROCEDURE test.tri_parent_tab_insert(); 

5.测试

  在数据库中点击查看主表数据时是有数据的,每个分区的子表中也有数据,然而当查看每个表的物理大小时发现主表的大小为零,其他子表物理大小不为零。这说明主表中的数据可能是子表中数据的映射(描述不专业)。那么问题来了: 如果我们删除子表中数据时,那么主表中的原始数据则会丢失。 如果考虑删除原始数据的话,我们可以选择 Truncate(清空表数据保持表中原有的结构)  delete(删除单个或多个数据保留数据表的原有结构) drop(删除表和所有表关系)。

 

 

问题:

在测试时遇到的问题:

模式问题:在PGSQL中,每个都会有一个默认的模式(public),而以上代码创建了其他的模式,导致报错。我们可以选择在之前先创建一个“Test”模式 “CREATE SCHEMA Test”在这个模式中去建表、建触发函数以及触发器。 在public(只有一个模式)模式下,可省略“test:(这里语言的准确性还需测试,当我在一个public模式下这样是可以的)

注意:只要提示模式问题,改为当前模式最好。(建议用public比较方便)