继承

PostgreSQL 9.4.4 中文手册
上一页 | 上一级 | 章 3. 高级特性 | 下一页

# 3.6. 继承

继承是面向对象的数据库的概念。它开启了数据库设计的有趣的新的可能性。

让我们创建两个表：一个`cities`表和一个`capitals`表。 自然，首府(capital)也是城市(cities)，因此在列出所有城市时你想要某种方法隐含地显示首府。 如果你已经很高明了，那么你可能会创造类似下面这样的模式：

    CREATE TABLE capitals (
      name       text,
      population real,
      altitude   int,    -- (单位是英尺)
      state      char(2)
    );

    CREATE TABLE non_capitals (
      name       text,
      population real,
      altitude   int     -- (单位是英尺)
    );

    CREATE VIEW cities AS
      SELECT name, population, altitude FROM capitals
        UNION
      SELECT name, population, altitude FROM non_capitals;

如果只是查询，那么这个方法运转得很好，但是如果你需要更新某几行，那这个方法就很难看了。

一种更好的方法是：

    CREATE TABLE cities (
      name       text,
      population real,
      altitude   int     -- (单位是英尺)
    );

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

在这个例子里，`capitals`继承了其父表 `cities`的所有字段(`name`,`population` 和`altitude`)。字段`name`的类型`text`是 PostgreSQL用于变长字符串的固有类型。州首府有一个额外的字段 `state`显示其所处的州。在PostgreSQL里， 一个表可以从零个或者更多其它表中继承过来。

比如，下面的查询找出所有海拔超过 500 英尺的城市的名字，包括州首府：

    SELECT name, altitude
      FROM cities
      WHERE altitude > 500;

它返回：

       name    | altitude
    -----------+----------
     Las Vegas |     2174
     Mariposa  |     1953
     Madison   |      845
    (3 rows)

另一方面，下面的查询找出所有不是州首府并且位于海拔超过500英尺的城市：

    SELECT name, altitude
        FROM ONLY cities
        WHERE altitude > 500;

       name    | altitude
    -----------+----------
     Las Vegas |     2174
     Mariposa  |     1953
    (2 rows)

`cities`前面的`ONLY`指示系统只对`cities` 表运行查询，而不包括继承级别中低于`cities`的表。 许多我们已经讨论过的命令—`SELECT`, `UPDATE`和 `DELETE`—都支持这个`ONLY`表示法。

> 注意: 尽管继承经常是有用的，但是它还没有集成唯一约束或者外键，因此制约了其实用性。 参阅第 5.8 节以获取更多细节。

上一页 | 起始页 | 下一页
窗口函数 | 上一级 | 结论