Chapter 5. Postgres SQL 高级特性

Table of Contents
5.1. 继承
5.2. 非原子数值
5.3. 更多的高级特性

在结束了讲述如何使用 Postgres SQL 访问数据的基本方法的课程之后,我们将开始讨论 Postgres 区别于其他传统数据库管理器的特性. 这些特性包括:继承,时间漫游和非原子数值(数组和有值字段) (array- and set-valued attributes). 本节的例子可以在教程目录的 advance.sql 文件中找到.(如何使用参见 Chapter 4 。)

5.1. 继承

让我们创建两个表.表 capitals 包含各州的首府, 同时也是cities表.自然而然,表 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 的类型是textPostgres 用于变长 ASCII 字符串的内部类型. 字段 population 的类型是 realPostgres 的单精度浮点数据类型.表 capitals 多一个字段,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的表.我们已经讨论过的许多命令 -- SELECTUPDATEDELETE -- 都支持这个 “ONLY” 表示法.

过时: 以前的 Postgres版本里,缺省是 不访问子表.后来发现这样容易出错的而且违反SQL99规范. 在旧语法里,要访问子表,你必须在表后面附加"*". 比如:

SELECT * from cities*;
你仍然可以通过附加 "*" 明确声明扫描子表,以及通过声明 “ONLY” 明确指出不扫描子表.但是从 7.1 版本开始, 对未修饰的表缺省的行为是扫描它的子表,而以前的缺省是不扫描. 要想使用老习惯,把配置选项 SQL_Inheritance 设为 off,也就是:
SET SQL_Inheritance TO OFF;
或者往你的 postgresql.conf 文件里加这么一行.