Postgresql中的“后代表”是什么?

时间:2017-11-30 21:55:18

标签: sql postgresql

Postgresql的数据库转储使用ALTER TABLE ONLY tablename而不是我熟悉的ALTER TABLE tablename。我很好奇ONLY关键字的作用,所以我在Postgresql documentation中查找了它,并说明了以下内容:

  

名称

     

要更改的现有表的名称(可选择模式限定)。如果在表名之前指定了ONLY,则仅更改该表。如果未指定ONLY,则更改表及其所有后代表(如果有)。 (可选)可以在表名后指定*以明确指示包含后代表。

什么是后代表?

2 个答案:

答案 0 :(得分:6)

  

PostgreSQL实现了表继承,这可以是一个有用的工具   对于数据库设计师(SQL:1999及更高版本定义了类型继承   功能,在许多方面与所描述的功能不同   此处。)

     

让我们从一个例子开始:假设我们正在尝试构建数据   城市模型。每个州都有许多城市,但只有一个城市。我们   希望能够快速检索首都城市   特殊的国家。这可以通过创建两个表来完成,一个用于   州首府和非首都城市。但是,什么   当我们想要询问有关城市的数据时,就会发生这种情况   是否是资本?继承功能可以帮助   解决这个问题。我们定义大写表以便它继承   来自城市:

CREATE TABLE cities (
    name            text,
    population      float,
    altitude        int     -- in feet
);

CREATE TABLE capitals (
    state           char(2)
) INHERITS (cities);
  

在这种情况下,大写表会继承其所有列   父表,城市。州首府还有一个额外的栏目,州,   这显示了他们的状态。

     

在PostgreSQL中,表可以从零个或多个其他表继承,以及   查询可以引用表的所有行或a的所有行   表及其所有后代表。后者的行为是   默认值。

来源:https://www.postgresql.org/docs/8.4/static/ddl-inherit.html

答案 1 :(得分:2)

表的后代表是直接或间接来自inherit的表。因此,如果表B继承表A,而表C继承表B,则:

  • BCA的后代表。
  • CB
  • 的后代表

对表的查询(没有ONLY)是对表和所有后代表的查询。因此,例如,具有子代表的表上的SELECT实际上是该表及其所有后代表的UNION SELECT ... FROM ONLY。 (实际上,如果您在具有后代的表上检查SELECT查询的查询计划,您将看到该计划与此类UNION查询几乎完全相同。)

如果您不使用表继承,则ONLY关键字对查询没有影响,因为后代表集为空。