Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2339377
  • 博文数量: 194
  • 博客积分: 3409
  • 博客等级: 中校
  • 技术积分: 3944
  • 用 户 组: 普通用户
  • 注册时间: 2010-12-24 10:21
个人简介

● ITPUB名人堂嘉宾 ● ChinaUnix社区博客专家 ● ChinaUnix社区Oracle板块版主 ● 优酷网认证音乐牛人:EricGuitar ● SDOUG 核心成员 ●E-mail:gaoqiangdba@163.com

文章分类

全部博文(194)

文章存档

2020年(6)

2019年(7)

2016年(5)

2015年(36)

2014年(23)

2013年(15)

2012年(23)

2011年(61)

2010年(18)

分类: Mysql/postgreSQL

2015-07-13 13:39:13




目的:
创建分区表并插入数据,验证数据存放效果。


思路:
PG的分区表和Oracle与MySQL有所不同,是基于子表实现的分区表,即创建一个父表,然后创建子表,插入的数据会存放在子表中,但是增删改操作的语句写父表即可,数据分放的规则通过触发器、存储过程实现。

本次测试中共创建4个子表和1个父表,分别为rock、pop、jazz和classic4个子表和1个music父表,往里面插入歌曲信息,并验证是否自动存放到响应的分区内。




测试过程:

创建父表:                                            
music=> create table music(id int,name text,style text);
CREATE TABLE

创建子表:
music=> create table rock (check(style = 'rock')) inherits(music);
CREATE TABLE
music=> create table pop (check(style = 'pop')) inherits(music);
CREATE TABLE
music=> create table classic (check(style = 'classic')) inherits(music);
CREATE TABLE
music=> create table jazz (check(style = 'jazz')) inherits(music);
CREATE TABLE



查看表相关信息:
music=> \d
                关联列表
 架构模式 |  名称   |  型别  |  拥有者  
----------+---------+--------+----------
 public   | classic | 资料表 | eric
 public   | jazz    | 资料表 | eric
 public   | music   | 资料表 | eric
 public   | pop     | 资料表 | eric
 public   | rock    | 资料表 | eric
 public   | test    | 资料表 | postgres
(6 行记录)

可以看到music有4个子表,分别为classic,jazz,pop和rock:
music=> \dS+ music
                 资料表 "public.music"
 栏位  |  型别   | 修饰词 |   存储   | 统计目标 | 描述 
-------+---------+--------+----------+----------+------
 id    | integer |        | plain    |          | 
 name  | text    |        | extended |          | 
 style | text    |        | extended |          | 
子表: classic,
      jazz,
      pop,
      rock


可以看到pop表的父表为music:
music=> \dS+ pop
                  资料表 "public.pop"
 栏位  |  型别   | 修饰词 |   存储   | 统计目标 | 描述 
-------+---------+--------+----------+----------+------
 id    | integer |        | plain    |          | 
 name  | text    |        | extended |          | 
 style | text    |        | extended |          | 
检查约束限制
    "pop_style_check" CHECK (style = 'pop'::text)
继承: music

为子表创建索引:
music=> create index music_pop_id on pop (id);
CREATE INDEX
music=> create index music_rock_id on rock (id);
CREATE INDEX
music=> create index music_jazz_id on jazz (id);
CREATE INDEX
music=> create index music_classic_id on classic (id);
CREATE INDEX


创建function:
music=> CREATE OR REPLACE FUNCTION music_insert_trigger()
music-> RETURNS TRIGGER AS 
music-> $$
music$> BEGIN
music$>      IF (NEW.style = 'rock') THEN
music$>          INSERT INTO rock VALUES (NEW.*);
music$>      ELSEIF (NEW.style = 'pop') THEN
music$>          INSERT INTO pop VALUES (NEW.*);
music$>      ELSEIF (NEW.style = 'pop') THEN
music$>          INSERT INTO pop VALUES (NEW.*);
music$>      ELSEIF (NEW.style = 'jazz') THEN
music$>          INSERT INTO jazz VALUES (NEW.*);
music$>      ELSEIF (NEW.style = 'classic') THEN
music$>          INSERT INTO classic VALUES (NEW.*);
music$>      END IF;
music$>      RETURN NULL;
music$> END;
music$> $$
music-> LANGUAGE plpgsql ;
CREATE FUNCTION



创建触发器:
music=> CREATE TRIGGER insert_music_trigger 
music->     BEFORE INSERT ON  music
music->     FOR EACH row EXECUTE PROCEDURE music_insert_trigger() ;
CREATE TRIGGER


插入数据:
music=> insert into music values(2,'Have a Nice Day','pop')
;
INSERT 0 0
music=> insert into music values(1,'21 Gun','rock')
;
INSERT 0 0



验证数据插入效果:


查询父表:

music=> select * from music;
 id |      name       | style 
----+-----------------+-------
  1 | 21 Gun          | rock
  2 | Have a Nice Day | pop
(2 行记录)

查询子表:
music=> select * from pop ;
 id |      name       | style 
----+-----------------+-------
  2 | Have a Nice Day | pop
(1 行记录)


music=> select * from rock;
 id |  name  | style 
----+--------+-------
  1 | 21 Gun | rock
(1 行记录)



不同的数据严格的按照规则存放进入了相应的表中。
阅读(2593) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~