Redrock Postgres 搜索 英文
版本: 9.3 / 9.4 / 9.5 / 9.6 / 10 / 11 / 12 / 13 / 14 / 15 / 16 / 17

3.6. 继承 #

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

让我们创建两个表:表 cities 和表 capitals。很明显,首府也是城市,因此在列出所有城市时,你希望以某种方式隐式显示首府。如果真的很聪明,可能会发明这样的一个规则

CREATE TABLE capitals (
  name       text,
  population real,
  elevation  int,    -- (in ft)
  state      char(2)
);

CREATE TABLE non_capitals (
  name       text,
  population real,
  elevation  int     -- (in ft)
);

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

就查询而言,这很好用,但如果你需要更新多行时,它会变得很麻烦。

更好的解决方案如下

CREATE TABLE cities (
  name       text,
  population real,
  elevation  int     -- (in ft)
);

CREATE TABLE capitals (
  state      char(2) UNIQUE NOT NULL
) INHERITS (cities);

在此案例中,capitals 的行会从其 父级 cities 继承所有列(namepopulationelevation)。列 name 的类型是 text,这是 PostgreSQL 中可变长度字符字符串的本机类型。capitals 表有一个附加列 state,它显示该表的州缩写。在 PostgreSQL 中,表可以从 0 个或多个其他表继承。

例如,以下查询查找位于海拔 500 英尺以上的所有城市(包括州首府)的名称

SELECT name, elevation
  FROM cities
  WHERE elevation > 500;

返回

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

另一方面,以下查询查找所有不是州首府且位于海拔 500 英尺以上的所有城市

SELECT name, elevation
    FROM ONLY cities
    WHERE elevation > 500;
   name    | elevation
-----------+-----------
 Las Vegas |      2174
 Mariposa  |      1953
(2 rows)

此处,ONLYcities 之前表示应仅针对 cities 表运行查询,而不是 cities 在继承层次结构中下方的表。我们已经讨论过的许多命令(SELECTUPDATEDELETE)支持此 ONLY 表示法。

注意

尽管继承通常会有用,但它尚未与唯一约束或外键结合使用,这限制了它的有用性。有关更多详细信息,请参见第 5.11 节