使用CREATE TABLE INHERITS时如何继承注释

时间:2012-11-08 06:43:12

标签: postgresql create-table inheritance

我使用

创建了一个表basetemplate
CREATE TABLE basetemplate (
    time_of_creation timestamp with time zone,
);

现在,我想创建包含table1字段的table2time_of_creation,其中包含CREATE TABLE LIKE字段。 我尝试使用CREATE TABLE INHERITSCREATE TABLE INHERITS。 其中ALTER TABLE似乎更符合我的要求,因为我可以使用同一查询中指定的新表的字段创建新表。但对于另一种方法,我必须使用CREATE TABLE INHERITS查询来添加我的新表的特定字段。 CREATE TABLE INHERITS继承了字段,它的约束;但不是它的评论 我的问题是,这是否是满足我需求的最佳方式,还有一种方法可以在使用{{1}}时继承评论。

1 个答案:

答案 0 :(得分:3)

CREATE TABLE INHERITS不适合仅复制表定义。表的实际数据是链接的,因此如果这不是您想要的,那么请不要使用表继承,使用CREATE TABLE ... LIKECREATE TABLE ... OF TYPE,然后使用{添加字段{1}}命令。如果这太麻烦了,那么你应该只是定义一个新表,或者使用复合类型或域。

您似乎正在尝试将OOP多态继承应用于SQL。不是一个好主意。在这种情况下,你最好的选择几乎肯定只是重复共同领域。在更复杂的情况下,您可以创建ALTER TABLE,或使用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) 没有任何开销。你会发现它会让以后的某些管理任务变得更复杂,并且会使表分区变得复杂。总的来说,除非你需要,否则我不建议使用继承。