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

标签 postgresql create-table inheritance

我有一个使用以下命令创建的表basetemplate:

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 时是否还有继承注释的方法。

最佳答案

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 中没有任何开销。不过,您会发现它会使以后执行一些管理任务变得更加复杂,并且会使表分区等事情变得复杂。总的来说,除非需要,否则我不建议使用继承。

关于postgresql - 使用 CREATE TABLE INHERITS 时如何继承注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13283854/

相关文章:

postgresql - 嵌套 jsonb 字段上的慢速不同 PostgreSQL 查询不会使用索引

sql - Postgis计算点与点之间的距离

mysql - 是否有另一个查询的 'SHOW CREATE TABLE'

java - Scala 中的多个构造函数应该调用不同的 super 方法

python - 从 executemany 语句中获取 'return' d 值

sql - 如何更新 JSONB 数组中的多个值 Postgresql 数组对象

mysql - 这个创建表语法有什么问题

mysql - 为什么我不断收到此错误 : ERROR 1064 (42000)?

c++ - 当您不知道传递给重写函数的参数时,在基类中创建重写方法?

java - 如何使扩展另一个扩展类的类与通用集合一起使用?