↑↓ 选择↵ 打开⌫ 切换范围完整搜索

PG.CENTER 连接 PostgreSQL 文档、百科与生态知识。由 Pigsty 维护。

支持中的版本: 当前版本 (18) / 17 / 16 / 15 / 14
开发中的版本: 19 / 20devel
已结束支持的版本: 13 / 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2
预发布版本文档。 PostgreSQL 19beta4 为测试版本,最终发布内容可能有所不同。

3.6. 继承 #

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

让我们创建两个表:表 cities 和表 capitals。很自然,州首府也是城市,因此当你列出所有城市时,应该有某种办法能隐式地把州首府也显示出来。如果你很有巧思,也许会想出这样的方案:

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

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

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     -- (单位为英尺)
);

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

在这种情况下,capitals 的一行会从它的父表 cities 继承全部列(name、population 和 elevation)。列 name 的类型是 text,这是 PostgreSQL 内置的一种变长字符串类型。capitals 表还有一个额外的列 state,用来表示所在州的缩写。在 PostgreSQL 中,一个表可以从零个或多个其他表继承。

例如,下面的查询会找出所有海拔超过 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)

这里,放在 cities 前面的 ONLY 表示该查询只针对 cities 表执行,而不包括继承层次中位于 cities 之下的表。我们前面已经讨论过的许多命令 — SELECT、UPDATE 和 DELETE — 都支持这种 ONLY 记法。

注意

尽管继承经常很有用,但它尚未与唯一约束或外键集成,这限制了它的实用性。更多细节见第 5.12 节。

报告文档问题

阅读 上游文档. 反馈更正前请先核对 当前版本手册.