在早期的版本中pg中的分割槽表都是通過繼承的方式建立的,通過繼承的方式來建立分割槽表的這種方式用起來不是很方便。
mydb=# create
table parent(id int
primary
key,name varchar(100));
create
table
mydb=# create index idx_name on parent(name);
create index
mydb=# create
table child(age int,*** int) inherits(parent);
create
table
mydb=# \d child;
table "public.child"
column | type | modifiers
--------+------------------------+-----------
id | integer | not null
name | character varying(100) |
age | integer |
*** | integer |
inherits: parent
mydb=# \d parent;
table "public.parent"
column | type | modifiers
--------+------------------------+-----------
id | integer | not null
name | character varying(100) |
indexes:
"parent_pkey" primary key, btree (id)
"idx_name" btree (name)
number of child tables: 1 (use \d+ to list them.)
mydb=# insert
into parent values(1,'aa');
insert01
mydb=# select * from parent;
id | name
----+------
1 | aa
(1 row)
mydb=# select * from child;
id | name | age | ***
----+------+-----+-----
(0 rows)
mydb=# insert
into child values(1,'bb',1,1);
insert01
mydb=# select * from parent;
id | name
----+------
1 | aa
1 | bb
(2 rows)
mydb=# select * from child;
id | name | age | ***
----+------+-----+-----
1 | bb | 1 | 1
(1 row)
分割槽表的例子
mydb=# create table t_parent(id int ,name varchar(100),c_time date);
create table
mydb=# create table t_part1(check(c_time>='2017-01-01'
and c_time<='2017-02-01')) inherits(t_parent);
create table
mydb=# create table t_part2(check(c_time>='2017-02-01'
and c_time<='2017-03-01')) inherits(t_parent);
create table
create
or replace function
t_parent_insert_trigger
()returns
trigger
as $$
begin
if( new.c_time >= date '2017-01-01'
andnew.c_time <= date '2017-02-01' )
then
insert
into
t_part1
values
(new.*);
elsif ( new.c_time >date '2017-02-01'
andnew.c_time <= date '2017-03-01' ) then
insert into t_part2 values (new.*);
else
raise exception 'date out of range';
endif;
return null;
end;
$$
language plpgsql;
create trigger insert_t_parent_trigger before insert on t_parent for
each row execute procedure
t_parent_insert_trigger
();mydb=# insert into t_parent values(1,'aa',date '2017-01-02');
insert 0
0mydb=# select * from t_part1;
id | name | c_time
----+------+------------
1 | aa | 2017-01-02
(1 row)
mydb=# insert into t_parent values(1,'aa',date '2018-01-02');
error: date out
of range
context: pl/pgsql function
t_parent_insert_trigger
()line 10 at
raise
mydb=# update
t_parent
setname='bb' where
id=1;
update 1
mydb=# select * from t_part1;
id | name | c_time
----+------+------------
1 | bb | 2017-01-02
(1 row)
在刪除分割槽的時候,倒是不用維護這個觸發器
mydb=# drop table t_part1;
drop table
mydb=# insert into t_parent values(1,'aa',date '2017-02-02');
mydb=# select * from t_parent;
id | name | c_time
----+------+------------
1 | aa | 2017-02-02
(1 row)
看到上面的這種方式處理起來不是很方便 Postgresql之分割槽表
參考 建立步驟 注意 以下針對10.0版本之前的用法,新版本見 1 建立主表。不用為該錶定義任何檢查限制,除非需要將該限制應用到所有的分割槽表中。同樣也無需為該錶建立任何索引和唯一限制。create table almart date key date,hour key smallint,clien...
PostgreSQL父子表和分割槽表對比
從整體上來看,子表和分割槽表有相同的地方也有差別,因為都使用了繼承的特性,所以本質上是一樣的。下面看一下二者的區別 1.父子表 建立父表 create table cities name text,population float,altitude int 建立子表 create table cap...
POSTGRESQL分割槽表模式下查詢效率測試
create table sheet sale main test 20072102 partition of sheet sale main test for values from 2020 07 01 to 2021 03 01 create table sheet sale main tes...