PostgreSQL中的繼承
Inheritance是PostgreSQL獨有的,也是前文中我們提到的“使用物件導向的思想來組織資料庫”的具體體現之一。
一, 表的繼承。
這裡我們使用官網說明中的例子,原文在這裡:
https://www.postgresql.org/docs/12/tutorial-inheritance.html
CREATE TABLE cities (
name text,
population real,
elevation int – (in ft)
);
CREATE TABLE capitals (
state char(2)
) INHERITS (cities);
省會其實也是城市,只是比普通的城市多了一個state,表明是哪個省的省會。在上例中capitals表繼承了cities表中的所有欄位。In PostgreSQL, a table can inherit from zero or more other tables.
INSERT INTO cities VALUES (‘洛陽’,1500, 50);
INSERT INTO cities VALUES (‘開封’,1000, 50);
INSERT INTO capitals VALUES (‘鄭州’,2000, 50, ‘HN’);
假設有洛陽,鄭州和開封三個城市,其中鄭州是省會城市。由上面可見,插入資料時只需要向capitals插入鄭州的資料即可。根據物件導向的思想,我們可以認為表中的每一行就是一個例項化後的物件,而鄭州只應該被例項化一次。此時檢視錶中的資料:
SELECT * FROM cities;
“name” “population” “elevation”
“洛陽” “1500” “50”
“開封” “1000” “50”
“鄭州” “2000” “50”
SELECT * FROM capitals;
“name” “population” “elevation” “state”
“鄭州” “2000” “50” “HN”
檢視了資料後,我們可以很容易地理解下面的語句:
SELECT name, elevation
FROM ONLY cities;
上面的SQL返回除省會以外的所有城市。Here the ONLY before cities indicates that the query should be run over only the cities table, and not tables below cities in the inheritance hierarchy.
這裡有一個帖子討論使用table inheritation到底能帶來什麼益處:
https://stackoverflow.com/questions/3074535/when-to-use-inherited-tables-in-postgresql
二, Type的“繼承”
首先要說明的是,PostgreSQL並不支援type的繼承,這也是上面的繼承打上引號的原因。
資料型別是每個資料庫都有的概念,例如int32,char等等。PostgreSQL中的composite type很特別。本質上說,composite type is essentially just a list of field names and their data types.
CREATE TYPE inventory_item AS (
name text,
supplier_id integer,
price numeric
);
CREATE TABLE on_hand (
item inventory_item, – 使用剛剛定義的type
count integer
);
INSERT INTO on_hand VALUES (ROW(‘fuzzy dice’, 42, 1.99), 1000);
–注意這裡的ROW()是構造type的方法。
需要注意的是當建立一張表時,一個composite type就會自動建立出來,type名與表名相同,且使用方式和一般的type無異。我們也可以像下面這樣使用type建表:
CREATE TABLE on_hand2 OF inventory_item;
回到我們的問題,由於type沒有直接的繼承,因此在postgres中我們可以這樣實現變相的type繼承:
CREATE TYPE supertype AS (
foo int,
bar text
);
CREATE TYPE subtype AS (
super supertype,
baz int
);
三,如何查詢使用了type的表的資料:
SELECT item FROM on_hand;
“item”
“(”“fuzzy dice”",42,1.99)" – 返回的是一個type物件,因此需要用如下語句查詢column:
SELECT (item).name,(item).* FROM on_hand;
“name” “name” “supplier_id” “price”
“fuzzy dice” “fuzzy dice” “42” “1.99”
最後,由於PostgreSQL支援繼承,因此很多table,view等等形成了複雜的依賴關係。PostgreSQL提供方法來查詢這些依賴關係。
https://www.postgresql.org/docs/12/ddl-depend.html
相關文章
- PostgreSQL 表繼承SQL繼承
- PostgreSQL:表繼承SQL繼承
- C++中公有繼承、保護繼承、私有繼承的區別C++繼承
- JS中的繼承JS繼承
- java中的繼承Java繼承
- JavaScript中的繼承JavaScript繼承
- Solidity中的繼承Solid繼承
- odoo 繼承(owl繼承、web繼承、view繼承)Odoo繼承WebView
- JS中的繼承(下)JS繼承
- 聊聊JS中的繼承JS繼承
- JS中的繼承(上)JS繼承
- C++中的繼承C++繼承
- Javascript繼承4:潔淨的繼承者—-原型式繼承JavaScript繼承原型
- PostgreSQL使用表繼承實現分割槽表SQL繼承
- JS中繼承的實現JS中繼繼承
- JavaScript中的六種繼承JavaScript繼承
- JavaScript中的函式繼承JavaScript函式繼承
- 淺談JavaScript中的繼承JavaScript繼承
- ES6中的類繼承和ES5中的繼承模式詳解繼承模式
- 菱形繼承,虛繼承繼承
- 原型,繼承——原型繼承原型繼承
- 類的繼承_子類繼承父類繼承
- 面試中聊到的javascript中的繼承面試JavaScript繼承
- 多繼承 與 多重繼承繼承
- JS中的繼承與原型鏈JS繼承原型
- 繼承中的建構函式繼承函式
- 徹底搞懂JavaScript中的繼承JavaScript繼承
- JS中的多種繼承方式JS繼承
- JavaScript 中的六種繼承方式JavaScript繼承
- js中的繼承(es5)JS繼承
- c++中的繼承關係C++繼承
- Python中的繼承和多型Python繼承多型
- JavaScript中的繼承和組合JavaScript繼承
- Javascript繼承2:建立即繼承—-建構函式繼承JavaScript繼承函式
- PostgreSQL分割槽表、繼承表記錄去重方法SQL繼承
- PostgreSQL用CTE語法+繼承實現拆分大表SQL繼承
- 類的繼承繼承
- Java的繼承Java繼承