Postgresql 中文操作指南
3.6. Inheritance #
继承是面向对象数据库中的一个概念。它开辟了数据库设计中的有趣的新可能性。
让我们创建两个表:一张表 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 的一行 inherits 其 parent 的所有列(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 标记。
Note
尽管继承经常是有用的,但它尚未与唯一约束或外键集成,限制了它的有用性。有关更多详细信息,请参见 Section 5.10。