返回介绍

I. 教程

II. SQL 语言

III. 服务器管理

IV. 客户端接口

V. 服务器端编程

VI. 参考手册

VII. 内部

VIII. 附录

3.5. 继承

发布于 2019-09-30 03:05:47 字数 1927 浏览 1188 评论 0 收藏 0

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

让我们创建两个表:一个 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以获取更多细节。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文