表继承与分区表

表继承

  • 表继承是PostgreSQL特有的
create table persons (
age int,
sex boolean
); create table students (
class_no int
) inherits (persons);
  • select,update,delete,alter table父表操作时,同时也会操作或影响子表, 反之不会;
  • 只查询父表数据
select * from only persons;
  • 父表的检查约束和非空约束会被继承,其他的约束则不会;
  • 一个子表可以继承多张父表;如果一个字段在多个父表出现会和成一个,同时继承所有父表的这个字段的约束;如果不同父表这个字段类型不同,则会报错;

分区表

  • 分区表就是把逻辑上的大表分隔成物理上的小块;PostgreSQL通过继承来实现;
  • 一般在表的大小超过了数据库服务器的物理内存大小时使用;
  • 在使用继承实现分区表时,一般会让父表为空,数据都存储在字表中;
  • 建立分区表的基本步骤,以一个销售表为例子
1)创建父表,没有数据,不定义任何约束与索引;所有分区都从这个表继承

//建立一张销售表
create table sales_detail (
product_id int not null, //产品编号
price numeric(12, 2), //单价
amount int not null, //数量
sale_date date not null, //销售日期
buyer varchar(40), //买家名称
buyer_contact text //买家联系
); 2) 继承创建子表,通常这些表不会增加任何字段; 同时增加约束并定义各个分区允许的键值; //按销售季度创建分区 create table sales_details_y2015q1 (check (
sale_date >= date '2015-01-01' and sale_date < date '2015-04-01'
)) inherits (sales_details); create table sales_details_y2015q2 (check (
sale_date >= date '2015-04-01' and sale_date < date '2015-07-01'
)) inherits (sales_details); create table sales_details_y2015q3 (check (
sale_date >= date '2015-07-01' and sale_date < date '2015-10-01'
)) inherits (sales_details); create table sales_details_y2015q4 (check (
sale_date >= date '2015-07-01' and sale_date < date '2016-01-01'
)) inherits (sales_details); 3) 对于每个分区,在关键字段创建一个索引,也可以在其他地方;虽然不是必须,但比较有帮助; create table index sale_detail_y2015q1_sale_date on sales_detail_y2015q1 (sale_date);
create table index sale_detail_y2015q2_sale_date on sales_detail_y2015q2 (sale_date);
create table index sale_detail_y2015q3_sale_date on sales_detail_y2015q3 (sale_date);
create table index sale_detail_y2015q4_sale_date on sales_detail_y2015q4 (sale_date); 4) 定义一个规则或触发器,把对主表的数据插入重定向到合适的分区表 create or replace function sale_detail_insert_trigger()
returns trigger as $$
begin
if (new.sale_date >= date '2015-01-01' and new.sale_date < date '2015-04-01') then
insert into sales_detail_y2015q1 values (new.*);
elseif (new.sale_date >= date '2015-04-01' and new.sale_date < date '2015-07-01') then
insert into sales_detail_y2015q2 values (new.*);
elseif (new.sale_date >= date '2015-07-01' and new.sale_date < date '2015-10-01') then
insert into sales_detail_y2015q3 values (new.*);
elseif (new.sale_date >= date '2015-10-01' and new.sale_date < date '2016-01-01') then
insert into sales_detail_y2015q4 values (new.*);
else
raise exception 'Date out of range, Fix the sale_detail_insert_tigger() function !';
end if;
return null;
end;
$$
language plpgsql; [create function]
//
create trigger insert_sale_detail_trigger
before insert on sales_details //父表
for each row execute procedure sale_detail_insert_trigger(); [create trigger] //也可以使用规则替代,但触发器更优; 5) 确保constraint_exclusion(约束排除)里的配置参数postgresql.conf是打开的;打开后,如果查询中where子句的过滤条件与分区的约束条件匹配,这个查询会职能地只查询这个分区 explain select count(*) from sales_details where sale_date < date '2015-04-01'; //这里将条件与各个分区的check比较,就知道只需要扫描主表和第一季度的表; set constraint_exclusion = 'off'; //修改参数后 explain select count(*) from sales_details where sale_date < date '2015-04-01'; //会扫描每一张表;

触发器

  • 由事件自动触发执行的特殊存储过程;可以对进行insert, update, delete等操作;
  • 用于加强数据的完整性约束和业务规则的约束;

建立一个触发器

  • 建立触发器的步骤;以删除学生表记录同时删除成绩表记录为例
//建表
create table student (
student_no int primety key,
student_name varchar(40),
age int
); create table score (
student_no int,
score int
); //建立触发器的执行函数
create or replace function student_delete_trigger()
returns trigger as $$
begin
delete from score where student_no = old.student_no;
return old;
end;
$$
language plpgsql; //建立触发器
create trigger delete_student_trigger
after delete on student
for each row execute procedure student_delete_trigger(); //插入数据后测试
delete from student where student_no = 1;

删除触发器

drop trigger [if exists] name on table [restrict | cascade]

restrict: 默认值,如果有任何依赖对象存在,拒绝删除
cascade: 级联删除依赖此触发器的对象

删除函数

drop function [if exists] name name([[argmode, argname] argtype, [...]])   [restrict | cascade]

  • 触发器实际保存在表pg_trigger中,也可以通过这里删除,但不推荐;

触发器函数中的特殊变量

  • new: 为insert/update操作触发的行为触发器中存储新的数据行;数据类型是recored;

    * 语句级别触发器和delete操作中此变量没有分配;
  • old: 为update/delete操作触发的行为触发器中存储旧的数据行;数据类型是recored;
    • 语句级别触发器和insert操作中此变量没有分配;
  • tg_name: 数据类型是name,包含实际触发的触发器名;
  • tg_when: 内容为beforeafter的字符串,用于指定before触发器还是after触发器;
  • tg_level: 内容为rowstatement,指定触发器级别;
  • tg_op: 内容为insert,update,delete,truncate之一,用于指定DML语言的类型;
  • tg_relid: 触发器所在表的OID;
  • tg_table_name: 触发器所在表的名称;
  • tg_table_schema: 触发器所在表的模式;
  • tg_nargs: 在create trigger语句里赋予触发器过程的参数个数;
  • tg_argv[]: text类型数组,create trigger语句里的参数;

psql-07表:分区表的更多相关文章

  1. HIVE外部表 分区表

    HIVE外部表 分区表    外部表        创建hive表,经过检查发现TBLS表中,hive表的类型为MANAGED_TABLE. 在真实开发中,很可能在hdfs中已经有了数据,希望通过hi ...

  2. Hive 外部表 分区表

      之前主要研究oracle与mysql,认为hive事实上就是一种数据仓库的框架,也没有太多另类,所以主要精力都在研究hadoop.hbase,sqoop,mahout,近期略微用心看了下hive. ...

  3. Oracle在线重定义DBMS_REDEFINITION 普通表—>分区表

    实验环境:RHEL 6.4 + Oracle 11.2.0.3实验:在线重定义 普通表 为 分区表,包括主键对应的索引都改造为分区索引. 1,构造普通表t_objects conn test1/tes ...

  4. Oracle普通表->分区表转换(9亿数据量)

    背景介绍: 环境:Linux 5.5 + Oracle 10.2.0.4 某普通表T,由于前期设计不当没有分区,如今几年来的数据量已达9亿+, 空间占用大约350G,在线重定义为分区表不现实,故采取申 ...

  5. APS.NET MVC + EF (07)---表单和HTML辅助方法

    在ASP.NET MVC中,可以借助HtmlHelper 对象来输出页面内容,提高开发效率.下面,我们将介绍一些常用的辅助方法. 7.1 HTML辅助方法 BeginForm 该辅助方法主要用来产生& ...

  6. 分区表,桶表,外部表,以及hive一些命令行小工具

    hive中的表与hdfs中的文件通过metastore关联起来的.Hive的数据模型:内部表,分区表,外部表,桶表受控表(managed table):包括内部表,分区表,桶表 内部表: 我们删除表的 ...

  7. 使用exchange普通表模式被切换到分区表

    随着数据库的不断增长的数据量.有些表需要转换的普通堆表分区表模式. 有几种不同的方式来执行此操作,如出口数据表,区表再导入数据到分区表:使用EXCHANGE PARTITION方式来转换为分区表以及使 ...

  8. 使用DBMS_REDEFINITION在线切换普通表到分区表

    随着数据库数据量的不断增长,有些表须要由普通的堆表转换为分区表的模式.有几种不同的方法来对此进行操作.诸如导出表数据,然后创建分区表再导入数据到分区表.使用EXCHANGE PARTITION方式来转 ...

  9. oracle 优化 —— 分区表

    一.分区表简介 分区表类型:[范围分区].[列表分区] [hash分区]    [这些分区的组合分区] 范围分区:以某一个范围进行分区.eg:时间段划分. 列表分区:以某一些几个值进行分区.eg:地区 ...

随机推荐

  1. webclient 和httpclient 应用

    //webclient应用 MyImageServerEntities db = new MyImageServerEntities(); public ActionResult Index() { ...

  2. Android 支付宝以及微信支付快速接入流程

    简介 随着移动支付的普及,越来越多的App采用第三发支付,在这里我们以支付宝为例,做一个快速集成! 一.Android快速实现支付宝支付 1.首先,我们需要前往支付宝开放平台,申请我们的支付功能:ht ...

  3. MyBatis之多表关联查询

    1使用resultType.ResultMap处理返回结果 处理返回结果 resultType:指定返回值结果的完全限定名,处理多表查询的结果. 多表查询需要定义vo封装查询的结果. 需求:查询部门和 ...

  4. Spring面向切面编程(AOP)方式二

    使用注解进行实现:减少xml文件的配置. 1 建立切面类 不需要实现任何特定接口,按照需要自己定义通知. package org.guangsoft.utils; import java.util.D ...

  5. 解决Eclipse里Maven工程报 An error occurred while filtering resources错误

    这几天被maven的单元测试折腾死了,以为是自己的eclipse有问题呢,今天早上来了又发现eclipse报了一个很奇怪的错误:An error occurred while filtering re ...

  6. 【转】深入理解const char*p,char const*p,char *const p,const char **p,char const**p,char *const*p,char**const p

    一.可能的组合: (1)const char*p (2)char const*p (3)char *const p(4)const char **p (5)char const**p (6)char ...

  7. Swift - 键盘弹出样式

    Swift提供了11种键盘类型: 在开发中,我们可以根据不同的需求,选择不同的键盘样式,例如,当我们只需要输入手机号码时,可以选择纯数字类型的键盘(.NumbersAndPunctuation),当我 ...

  8. C++ STL string

    要想使用标准C++中string类,必须要包含 #include <string>// 注意是<string>,不是<string.h>,带.h的是C语言中的头文件 ...

  9. React Native实例

    本文主要包括以下内容 View组件的实例 Text组件实例 Navigator组件实例 TextInput组件实例 View组件的实例 效果如下 代码如下 /** * Sample React Nat ...

  10. lsof -ntP -i:端口取出 动行程序的PID 然后xargs kill -9 这个进程

    [root@ok ok]# lsof -ntP -i: [root@ok ok]# netstat -lnutp|grep tcp /dnsmasq tcp /sshd tcp ::: :::* LI ...