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 来指定返回。