当前位置:数据库 > Postgres >>

postgresql分区的一个例子

postgresql分区的一个例子
 
1: 主表:
 
01
CREATE TABLE cms.pmd_opts
02
(
03
  id integer NOT NULL DEFAULT nextval('master.fact_data_id_seq'::regclass),
04
  created timestamp with time zone DEFAULT now(),
05
  updated timestamp with time zone DEFAULT now(),
06
  pmd_id integer NOT NULL,
07
  lovd_id integer NOT NULL, -- Set default value
08
  mt_attr_id integer NOT NULL,
09
  lov_id integer,
10
  mt_id integer NOT NULL,
11
-- 省略contraint
12
)

 

 
opts 数据是根据mt_attr_id 查找字典然后选择子表插入,定义function如下:
 
01
CREATE OR REPLACE FUNCTION cms.fc_insert_pmd_opts(id integer, pmd_id integer, lovd_id integer, mt_attr_id integer, lov_id integer, mt_id integer)
02
  RETURNS integer AS
03
$BODY$DECLARE
04
v_pmd_opt Integer;
05
v_opt_scheme Varchar;
06
v_opt_table Varchar;
07
v_un Varchar;
08
BEGIN
09
SELECT se_name,tb_name,un INTO v_opt_scheme,v_opt_table,v_un FROM v_mt_attr va WHERE va.id=mt_attr_id;
10
IF NOT FOUND THEN
11
    RAISE EXCEPTION 'Category Not Found';
12
END IF;
13
EXECUTE 'insert into '||v_opt_scheme||'.'||v_opt_table||'_'||v_un||'  (id,pmd_id,lovd_id,mt_attr_id,lov_id,mt_id) values '||
14
 '('||id||','||pmd_id||','||lovd_id||','||mt_attr_id||','||lov_id||','||mt_id||') returning '
15
 ||v_opt_table||'_'||v_un||'.id' into v_pmd_opt;
16
  --||v_opt_table||'_'||v_un||'.*' into v_pmd_opt;
17
 return v_pmd_opt;
18
END;$BODY$
19
  LANGUAGE plpgsql VOLATILE
20
  COST 100;

 

 
作用是通过 mt_attr_id 来选择子表。
1
v_mt_attr
是一个字典视图, 记录了不同的mt_attr_id对应的子表 schema 和 table名称。
 
以下是定义了转向操作:
 
1
CREATE OR REPLACE RULE ri_insert_pmd_opts AS
2
    ON INSERT TO cms.pmd_opts DO INSTEAD  SELECT cms.fc_insert_pmd_opts(new.id, new.pmd_id, new.lovd_id, new.mt_attr_id, new.lov_id, new.mt_id) AS id;

 

 
至此,分区完成。
 
对于插入的影响就是任何的插入, 就导致返回id. 不需要添加returning id在插入语句。 这是一个不同的地方。 因为插入已经被一个select语句替代。 不需要returning id 来指定返回。
 
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,