设为首页 收藏本站
查看: 1338|回复: 0

[经验分享] PostgreSQL数据库分区表创建与测试

[复制链接]

尚未签到

发表于 2016-12-21 10:04:51 | 显示全部楼层 |阅读模式
DSC0000.png


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


思路:
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 行记录)




DSC0001.gif 不同的数据严格的按照规则存放进入了相应的表中。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-317268-1-1.html 上篇帖子: 关于PostgreSQL流复制的延迟 下篇帖子: postgresql: 大对象(一:与bytea的区别)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表