【问题标题】:What are "descendant tables" in Postgresql?Postgresql 中的“后代表”是什么?
【发布时间】:2018-05-14 23:04:04
【问题描述】:

来自 Postgresql 的数据库转储使用 ALTER TABLE ONLY tablename 而不是我熟悉的 ALTER TABLE tablename。我很好奇 ONLY 关键字是做什么的,所以我在 Postgresql documentation 中查找它,它显示如下:

名字

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

什么是后代表?

【问题讨论】:

    标签: sql postgresql


    【解决方案1】:

    PostgreSQL 实现表继承,这可以是一个有用的工具 对于数据库设计者。 (SQL:1999 及以后定义类型继承 特征,这在许多方面与所描述的特征不同 在这里。)

    让我们从一个例子开始:假设我们正在尝试构建一个数据 城市的典范。每个州都有许多城市,但只有一个首府。我们 希望能够快速检索任何首都城市 特定状态。这可以通过创建两个表来完成,一个用于 州首府和非首都城市。然而,什么 当我们想要询问有关城市的数据时会发生这种情况,无论 是不是资本?继承特性可以帮助 解决这个问题。我们定义 capitals 表以便它继承 来自城市:

    CREATE TABLE cities (
        name            text,
        population      float,
        altitude        int     -- in feet
    );
    
    CREATE TABLE capitals (
        state           char(2)
    ) INHERITS (cities);
    

    在这种情况下,capitals 表继承了它的所有列 父表,城市。州首府也有一个额外的列,州, 这显示了他们的状态。

    在 PostgreSQL 中,一个表可以从零个或多个其他表继承,并且 查询可以引用表的所有行或 表加上它的所有后代表。后一种行为是 默认。

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

    【讨论】:

      【解决方案2】:

      一个表的后代表是所有inherit 来自它的表,无论是直接的还是间接的。所以如果表B继承表A,表C继承表B,那么:

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

      针对表的查询(不带ONLY)是针对该表和所有后代表的查询。因此,例如,具有后代表的表上的SELECT 实际上是该表及其所有后代表中的SELECT ... FROM ONLY 中的UNION。 (事实上​​,如果您在具有后代的表上检查 SELECT 查询的查询计划,您会发现该计划与此类 UNION 查询几乎相同。)

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

      【讨论】:

        猜你喜欢
        • 2023-01-07
        • 1970-01-01
        • 1970-01-01
        • 2019-12-10
        • 2011-03-16
        • 1970-01-01
        • 1970-01-01
        • 2021-02-27
        • 2021-09-09
        相关资源
        最近更新 更多