跳至主要內容

3.6 继承

LiuSongLing大约 2 分钟pgsqlpgsql

继承是来自面向对象的数据库的一个概念。

现在有两个表:一个表 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;

在查询中它运行得当,但是更新时,你会发现它会变得很丑陋。

PostgreSQL 有更好的解决办法:

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

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

在这种情况下,一行 capitals 从其父级 cities 继承所有列(name、population 和 elevation)。

列名的类型是 text,这是用于可变长度字符串的原生 PostgreSQL 类型。capitals 表还有一个附加列 state,它显示其 state 缩写。在 PostgreSQL 中,一个表可以从零个或多个其他表继承。

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

SELECT name, elevation
  FROM cities
  WHERE elevation > 500;

以下查询查找所有不是州首府且海拔超过 500 英尺的城市:

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

此处的 ONLY cities 表示查询应仅对 cities 表运行,而不是对继承层次结构中 cities 下面的表运行。

SELECT、UPDATE 和 DELETE — 都支持这种 ONLY 语法。