继承是面向对象数据库中的一个概念。它开辟了数据库设计中有趣的新可能性。
让我们创建两个表:一个表 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.10 节。
如果你在文档中看到任何不正确、不符合你对特定功能的体验或需要进一步澄清的内容,请使用此表单报告文档问题。