2012-11-08 20 views
2

我有一個表使用創建basetemplate如何使用CREATE TABLE當我繼承評論INHERITS

CREATE TABLE basetemplate (
    time_of_creation timestamp with time zone, 
); 

現在我想創建table1table2與不同領域,但都含有time_of_creation場。我試過使用CREATE TABLE LIKECREATE TABLE INHERITS。 在這CREATE TABLE INHERITS似乎更好地符合我的要求,因爲我可以創建具有在同一查詢中指定新表的字段的新表。但對於另一種方法,我將不得不使用ALTER TABLE查詢來添加我的新表的特定字段。 CREATE TABLE INHERITS繼承的領域,其約束;但不是其評論。
我的問題是,當使用CREATE TABLE INHERITS時,這是否是滿足我需求的最佳方式,並且還有繼承評論的方法。

回答

3

CREATE TABLE INHERITS不適合重複表格定義。表的實際數據被鏈接,所以如果這不是你想要的,那麼不要使用表繼承,使用CREATE TABLE ... LIKECREATE 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沒有任何開銷。不過,你會發現它會讓後面的一些管理任務變得更加複雜,並且會使表分區等複雜化。總的來說,我不建議使用繼承,除非你需要。

+0

「CREATE TABLE ... OF TYPE」不適用於我,因爲我看到它僅在Postgresql 9.0中添加。我的製作服務器仍然只支持'8.3'版本。 – saji89

+0

我不會在'basetemplate'表上做任何操作,所以使用繼承是可行的,或者它會在兩個表'table1'和'table2'之間創建任何混淆或數據衝突,它們從'basetemplate'單獨繼承'? – saji89

+0

@ saji89只要你從不創建從'table1'或'table2'繼承的表,它不應該創建任何數據衝突問題。我仍然認爲這是一個可怕的想法;它將使架構維護和更新變得更困難。只需重複所需的列,或定義一個複合類型並使用它。 –