继承是面向对象数据库中的一个概念。它为数据库设计打开了一些有趣的新可能性。
让我们创建两个表:表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)
这里,放在cities前面的ONLY表示该查询只针对cities表执行,而不包括继承层次中位于cities之下的表。我们前面已经讨论过的许多命令 — SELECT、UPDATE和DELETE — 都支持这种ONLY记法。
尽管继承经常很有用,但它尚未与唯一约束或外键集成,这限制了它的实用性。更多细节见Section 5.11。
如果您发现文档中有不正确的内容、与您使用特定功能的经验不符或需要进一步说明,请使用此表单来报告文档问题。