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

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

已结束支持的版本: 7.1 / 7.0 / 6.5 / 6.4
历史版本。 PostgreSQL 7.1 已结束支持。 请参阅 当前版本手册.

第 5 章 Postgres SQL 的高级特性

在介绍了使用 Postgres SQL 访问数据的基础知识之后,我们现在来讨论 Postgres 区别于传统数据管理器的那些特性。这些特性包括继承、时间旅行以及非原子数据值(数组值和集合值属性)。本节的示例也可以在教程目录的 advance.sql 中找到。(关于如何使用它,请参阅第 4 章。)

5.1. 继承 #

让我们创建两个表。capitals 表包含也是城市的州首府。自然,capitals 表应当从 cities 继承。

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

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

在这种情况下,capitals 的一行会从它的父表 cities 继承全部列(name、population 和 altitude)。列 name 的类型是 text,这是 Postgres 内置的一种变长 ASCII 字符串类型。列 population 的类型是 real,一种单精度浮点数类型。州首府有一个额外的列 state,用来表示所在的州。在 Postgres 中,一个表可以从零个或多个其他表继承,而一个查询既可以只引用一个表的所有行,也可以引用一个表及其所有后代的所有行。

注意

继承层次结构是一个有向无环图。

例如,下面的查询会找出所有海拔超过 500 英尺的城市名称,其中包括州首府:

SELECT name, altitude
    FROM cities
    WHERE altitude > 500;
    

它返回:

+----------+----------+
|name      | altitude |
+----------+----------+
|Las Vegas | 2174     |
+----------+----------+
|Mariposa  | 1953     |
+----------+----------+
|Madison   | 845      |
+----------+----------+
    

另一方面,下面的查询会找出所有不是州首府且海拔在 500 英尺或更高的城市:

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

+----------+----------+
|name      | altitude |
+----------+----------+
|Las Vegas | 2174     |
+----------+----------+
|Mariposa  | 1953     |
+----------+----------+
    

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

已废弃

在以前版本的 Postgres 中,默认不访问子表。这被发现容易出错,而且也违反 SQL99。按照旧语法,要获得子表需要在表名后追加"*"。例如

SELECT * from cities*;

你仍然可以通过追加"*"显式指定扫描子表,也可以通过书写 “ONLY” 显式指定不扫描子表。但从 7.1 版开始,不带修饰的表名的默认行为是同时扫描其子表,而以前默认不这样做。要得到旧的默认行为,可把配置选项 SQL_Inheritance 设置为 off,例如

SET SQL_Inheritance TO OFF;

或者在你的 postgresql.conf 文件中加一行。

报告文档问题

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