postgresql中的分割槽表

2021-08-15 14:14:29 字數 3883 閱讀 3517

在早期的版本中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...