ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
# 3.6\. 继承 继承是面向对象的数据库的概念。它开启了数据库设计的有趣的新的可能性。 让我们创建两个表:一个`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`表示法。 > **Note:** 尽管继承经常是有用的,但是它还没有集成唯一约束或者外键,因此制约了其实用性。 参阅[Section 5.8](#calibre_link-1041)以获取更多细节。