CREATE TABLE INHERITS
不適合重複表格定義。表的實際數據被鏈接,所以如果這不是你想要的,那麼不要使用表繼承,使用CREATE TABLE ... LIKE
或CREATE TABLE ... OF TYPE
,然後用ALTER TABLE
命令添加字段。如果這太麻煩,這可能是一個標誌,你應該只是定義一個新表,或者可能使用複合類型或域。
看來你正在嘗試將OOP多態繼承應用於SQL。不是一個好主意。在這種情況下,你最好的選擇就是重複共同領域。在更復雜的情況下,您可以創建一個DOMAIN
,或創建一個CREATE TYPE
複合類型,但在這種情況下,這是不必要的;只需在每個表格中重複該字段即可。
下面是如果你使用INHERITS
再行插入基表發生了什麼:
regress=> CREATE TABLE basetemplate (
time_of_creation timestamp with time zone
);
CREATE TABLE
regress=> CREATE TABLE table1 (col1 text) INHERITS (basetemplate);
CREATE TABLE
regress=> INSERT INTO table1(col1, time_of_creation) VALUES ('a', current_timestamp);
INSERT 0 1
regress=> SELECT * FROM table1 ;
time_of_creation | col1
-------------------------------+------
2012-11-08 16:23:35.645734+08 | a
(1 row)
罰款,到目前爲止,但現在:
regress=> select * from basetemplate ;
time_of_creation
-------------------------------
2012-11-08 16:23:35.645734+08
(1 row)
這可能不是你想要的。
它實際上沒有任何傷害;由於繼承,將行插入table1
沒有任何開銷。不過,你會發現它會讓後面的一些管理任務變得更加複雜,並且會使表分區等複雜化。總的來說,我不建議使用繼承,除非你需要。
「CREATE TABLE ... OF TYPE」不適用於我,因爲我看到它僅在Postgresql 9.0中添加。我的製作服務器仍然只支持'8.3'版本。 – saji89
我不會在'basetemplate'表上做任何操作,所以使用繼承是可行的,或者它會在兩個表'table1'和'table2'之間創建任何混淆或數據衝突,它們從'basetemplate'單獨繼承'? – saji89
@ saji89只要你從不創建從'table1'或'table2'繼承的表,它不應該創建任何數據衝突問題。我仍然認爲這是一個可怕的想法;它將使架構維護和更新變得更困難。只需重複所需的列,或定義一個複合類型並使用它。 –