第七十三章. Postgres SQL 高级特性

内容
继承
非原子数值
更多高级特性
在结束了使用 PostgresSQL 访问你的数据的基本方法的课程之后,我们将开始讨论Postgres区别于其他传统数据库管理器的特性.这些特性包括:继承,时间跟踪和非定量数值(数组和有值字段)(array- and set-valued attributes).本节的例子可以在教程目录的 advance.sql 文件中找到.(如何使用参见  第 72 章 。)
 

继承

让我们创建两个表.表 capitals 包含各州的首府,同时也是cities表.自然而然,表 capitals 应该从表 cities 继承下来.
CREATE TABLE cities (
    name            text,
    population      float,
    altitude        int     -- (in ft)
);

CREATE TABLE capitals (
    state           char(2)
) INHERITS (cities);
在本例中,一条 capitals 的记录 继承 所有父表 cities 的字段(name,population,和 altitude). 字段 name 的类型是 text, Postgres 用于变长 ASCII 字符串的类型.字段 population 的类型是 float, Postgres 的双精度浮点数据类型.表 capitals 多一个字段,state,表明首府所在的州.在 Postgres 里,一个表可以从0或更多个其他表继承下来,一个查询可以检索一个表的所有记录,也可以检索一个表和其所有后代的记录.
注意: 继承层次是一种开放的不循环的图形.
例如,下面查询将找出所有海拔500英尺以上的城市.
SELECT name, altitude
    FROM cities
    WHERE altitude > 500;

+----------+----------+
|name      | altitude |
+----------+----------+
|Las Vegas | 2174     |
+----------+----------+
|Mariposa  | 1953     |
+----------+----------+
另一方面,如果要找出包括州首府在内的海拔高于500英尺的城市,查询应该是这样的:
 
SELECT c.name, c.altitude
    FROM cities* c
    WHERE c.altitude > 500;
返回:
+----------+----------+
|name      | altitude |
+----------+----------+
|Las Vegas | 2174     |
+----------+----------+
|Mariposa  | 1953     |
+----------+----------+
|Madison   | 845      |
+----------+----------+
在这里 cities 后的 “*” 表明该查询应该遍历cities 和继承层次底于 cities 的表. 许多我们已经讨论过的命令(SELECT,UPDATEDELETE)都支持“*”(译注:类似通配符),还有其他的一些命令,象 ALTER