继承是面向对象数据库的一个概念。它开辟了数据库设计中有趣的新可能性。
让我们创建两个表:表 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 中,表可以从 0 个或多个其他表继承。
例如,以下查询查找位于海拔 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 节。