建立分区表需要的几个步骤:
(代码为网上借阅)
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比较方便)
浙公网安备 33010602011771号