PostgreSQL從繼承到分區(一)

PostgreSQL從繼承到分區

(pg_partman)


PostgreSQL從繼承到分區(一)

http://my.oschina.net/lianshunke/blog/205296

PostgreSQL從繼承到分區(二)

http://my.oschina.net/lianshunke/blog/205296

PostgreSQL從繼承到分區(三)

http://my.oschina.net/lianshunke/blog/205316


一、Inheritance

http://www.postgresql.org/docs/9.3/static/ddl-inherit.html

通過下面的簡單例子說明什麼是表繼承:

1.1 單表繼承

postgres=# CREATE DATABASE lsk;
CREATE DATABASE
postgres=# \c lsk 
You are now connected to database "lsk" as user "postgres".
lsk=# CREATE TABLE t1(id int,name varchar(20));
CREATE TABLE
lsk=# CREATE TABLE t2(age int) inherits(t1);
CREATE TABLE
{在子表中新添的字段會匯同父表的所有字段一起作爲子表字段}


lsk=# \d t1
             Table "public.t1"
 Column |         Type          | Modifiers 
--------+-----------------------+-----------
 id     | integer               | 
 name   | character varying(20) | 
Number of child tables: 1 (Use \d+ to list them.)

lsk=# \d t2
             Table "public.t2"
 Column |         Type          | Modifiers 
--------+-----------------------+-----------
 id     | integer               | 
 name   | character varying(20) | 
 age    | integer               | 
Inherits: t1


插入數據:

lsk=# INSERT INTO t1 VALUES (1,'lian1');
INSERT 0 1
lsk=# INSERT INTO t1 VALUES (2,'lian2');
INSERT 0 1
lsk=# INSERT INTO t2 VALUES (3,'lian3',11);
INSERT 0 1
lsk=# INSERT INTO t2 VALUES (4,'lian4',12);
INSERT 0 1


查看錶結果:

lsk=# SELECT * from t1;
 id | name  
----+-------
  1 | lian1
  2 | lian2
  3 | lian3
  4 | lian4
(4 rows)
{從父表中查詢將顯示父表及子表的所有數據}

lsk=# SELECT * from t2;
 id | name  | age 
----+-------+-----
  3 | lian3 |  11
  4 | lian4 |  12
(2 rows)
{從子表中查詢只顯示子表中的數據}

lsk=# SELECT * from only t1;
 id | name  
----+-------
  1 | lian1
  2 | lian2
(2 rows)
{通過ONLY關鍵字實現只對父表的查詢}



1.2 多表繼承

續1.1節內容

1.2.1 級聯繼承

創建t3表繼承上節子表t2:

lsk=# CREATE TABLE t3() inherits(t2);
CREATE TABLE
lsk=# \d t3
             Table "public.t3"
 Column |         Type          | Modifiers 
--------+-----------------------+-----------
 id     | integer               | 
 name   | character varying(20) | 
 age    | integer               | 
Inherits: t2



插入測試數據:

lsk=# INSERT INTO t3 VALUES (5,'lian5',13);
INSERT 0 1


查看錶結果:

lsk=# SELECT * from t1;
 id | name  
----+-------
  1 | lian1
  2 | lian2
  3 | lian3
  4 | lian4
  5 | lian5
(5 rows)
lsk=# SELECT * from t2;
 id | name  | age 
----+-------+-----
  3 | lian3 |  11
  4 | lian4 |  12
  5 | lian5 |  13
(3 rows)
lsk=# SELECT * from t3;
 id | name  | age 
----+-------+-----
  5 | lian5 |  13
(1 row)



1.2.2 並行繼承

創建t4表繼承頂層父表t1:

lsk=# CREATE TABLE t4() inherits(t1);
CREATE TABLE
lsk=# \d t4
             Table "public.t4"
 Column |         Type          | Modifiers 
--------+-----------------------+-----------
 id     | integer               | 
 name   | character varying(20) | 
Inherits: t1
lsk=# \d+ t1
                          Table "public.t1"
 Column |         Type          | Modifiers | Storage  | Description 
--------+-----------------------+-----------+----------+-------------
 id     | integer               |           | plain    | 
 name   | character varying(20) |           | extended | 
Child tables: t2,
              t4
Has OIDs: no
lsk=# INSERT INTO t4 VALUES (6,'lian6');
INSERT 0 1
lsk=# SELECT * from t1;
 id | name  
----+-------
  1 | lian1
  2 | lian2
  3 | lian3
  4 | lian4
  6 | lian6
  5 | lian5
(6 rows)
{可以看出查詢是按照分層順序查詢,即先並行再級聯}


lsk=# SELECT * from t4;
 id | name  
----+-------
  6 | lian6
(1 row)


1.3 查看數據來源

lsk=# SELECT p.relname,c.*  FROM t1 c, pg_class p WHERE c.tableoid = p.oid;
 relname | id | name  
---------+----+-------
 t1      |  1 | lian1
 t1      |  2 | lian2
 t2      |  3 | lian3
 t2      |  4 | lian4
 t4      |  6 | lian6
 t3      |  5 | lian5
(6 rows)


PostgreSQL從繼承到分區(一)

http://my.oschina.net/lianshunke/blog/205296

PostgreSQL從繼承到分區(二)

http://my.oschina.net/lianshunke/blog/205296

PostgreSQL從繼承到分區(三)

http://my.oschina.net/lianshunke/blog/205316


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章