继承是面向对象数据库中的一个概念。它为数据库设计开辟了有趣的可能性。
让我们创建两个表:一个名为 cities
的表和一个名为 capitals
的表。自然,首都也是城市,因此您需要某种方法来在列出所有城市时隐式地显示首都。如果您真的很聪明,您可能会想出这样的方案
CREATE TABLE capitals ( name text, population real, elevation int, -- (in ft) state char(2) ); CREATE TABLE non_capitals ( name text, population real, elevation int -- (in ft) ); CREATE VIEW cities AS SELECT name, population, elevation FROM capitals UNION SELECT name, population, elevation FROM non_capitals;
这在查询方面运行良好,但当您需要更新多行时会变得很麻烦,仅举一例。
一个更好的解决方案是
CREATE TABLE cities ( name text, population real, elevation int -- (in ft) ); CREATE TABLE capitals ( state char(2) UNIQUE NOT NULL ) INHERITS (cities);
在这种情况下,capitals
的一行 继承其 父 cities
的所有列(name
、population
和 elevation
)。列 name
的类型是 text
,这是一个用于可变长度字符串的原生 PostgreSQL 类型。capitals
表有一个额外的列 state
,它显示其州缩写。在 PostgreSQL 中,一个表可以从零个或多个其他表继承。
例如,以下查询查找所有城市(包括州府)的名称,这些城市的海拔高度超过 500 英尺
SELECT name, elevation FROM cities WHERE elevation > 500;
返回
name | elevation -----------+----------- Las Vegas | 2174 Mariposa | 1953 Madison | 845 (3 rows)
另一方面,以下查询查找所有不是州府且海拔高度超过 500 英尺的城市
SELECT name, elevation FROM ONLY cities WHERE elevation > 500;
name | elevation -----------+----------- Las Vegas | 2174 Mariposa | 1953 (2 rows)
这里 ONLY
位于 cities
之前,表示查询应该只在 cities
表上运行,而不是在继承层次结构中位于 cities
下面的表上。我们已经讨论过的许多命令(SELECT
、UPDATE
和 DELETE
)都支持这种 ONLY
符号。
虽然继承经常很有用,但它没有与唯一约束或外键集成,这限制了它的实用性。有关更多详细信息,请参见 第 5.11 节。
如果您在文档中看到任何不正确的内容、与您对特定功能的体验不符或需要进一步说明,请使用 此表单 报告文档问题。