2

我有一个basetemplate使用创建的表:

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

现在我想用不同的字段创建table1table2但都包含time_of_creation字段。我尝试使用CREATE TABLE LIKEand CREATE TABLE INHERITS。这CREATE TABLE INHERITS似乎更符合我的要求,因为我可以使用在同一查询中指定的新表字段创建新表。但是对于另一种方法,我将不得不使用ALTER TABLE查询来添加我的新表的特定字段。 CREATE TABLE INHERITS继承了字段,它的约束;但不是它的评论。
我的问题是,这是否是满足我需求的最佳方式,并且在使用CREATE TABLE INHERITS.

4

1 回答 1

3

CREATE TABLE INHERITS不适合仅复制表定义。表的实际数据是链接的,所以如果这不是你想要的,那么不要使用表继承,使用CREATE TABLE ... LIKEor ,然后使用命令CREATE TABLE ... OF TYPE添加字段。ALTER TABLE如果这太麻烦,则可能表明您应该只定义一个新表,或者可能使用复合类型或域。

您似乎正在尝试将 OOP 多态继承应用于 SQL。不是一个好主意。在这种情况下,你最好的选择几乎可以肯定就是重复共同领域。在更复杂的情况下,您可以创建DOMAIN,或使用 来创建复合类型CREATE TYPE,但在这种情况下,这是不必要的;只需重复每个表中的字段。

如果您使用INHERITSthen 在基表中插入一行,会发生以下情况:

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由于继承,插入行没有任何开销。但是,您会发现它使稍后执行某些管理任务变得更加复杂,并且会使诸如表分区之类的事情变得复杂。总的来说,除非你需要,否则我不建议使用继承。

于 2012-11-08T08:20:12.737 回答