宝塔做网站443链接/网站怎么做
GBase 8c实现了表继承,这对数据库设计者来说是一种有用的工具(SQL:1999及其后的版本定义了一种类型继承特性,但和这里介绍的继承有很大的不同)。
让我们从一个例子开始:假设我们要为城市建立一个数据模型。每一个省有很多城市,但是只有一个省会城市。我们希望能够快速地检索任何特定省的省会城市。这可以通过创建两个表来实现:一个用于省会城市,另一个用于不是省会的城市。然而,当我们想要查看一个城市的数据(不管它是不是一个省会城市)时会发生什么?继承特性将有助于解决这个问题。我们可以将capitals表定义为继承自cities表:
CREATE TABLE cities (
name text,
population float,
altitude int -− in feet
);
CREATE TABLE capitals (
state char(2)
) INHERITS (cities);
在这种情况下,capitals表继承了它的父表cities的所有列。省会城市还有一个额外的列state用来表示它所属的省。
在GBase 8c中,表可以从0个或者多个其他表继承,而对表的查询则可以引用该表的所有行或者该表的所有行加上它所有的后代表。默认情况是后一种行为。例如,下面的查询将查找所有海拔高于500尺的城市的名称,包括省会城市:
SELECT name, altitude
FROM cities
WHERE altitude > 500;
name | altitude
-−-−-−-−-−-+-−-−-−-−-−
Las Vegas | 2174
Mariposa | 1953
Madison | 845
在另一方面,下面的查询将找到海拔超过500尺且不是省会的所有城市:
SELECT name, altitude
FROM ONLY cities
WHERE altitude > 500;
name | altitude
-−-−-−-−-−-+-−-−-−-−-−
Las Vegas | 2174
Mariposa | 1953
这里的ONLY关键词指示查询只被应用于cities上,而其他在继承层次中位于cities之下的其他表都不会被该查询涉及。很多我们已经讨论过的命令(如SELECT、UPDATE和DELETE)都支持ONLY关键词。
我们也可以在表名后写上一个*来显式地将后代表包括在查询范围内:
SELECT name, altitude
FROM cities*
WHERE altitude > 500;
写*不是必需的,因为这种行为总是默认的。不过,为了兼容可以修改默认值的较老版本,现在仍然支持这种语法。
在某些情况下,我们可能希望知道一个特定行来自于哪个表。每个表中的系统列tableoid可以告诉我们行来自于哪个表:
SELECT c.tableoid, c.name, c.altitude
FROM cities c
WHERE c.altitude > 500;
将会返回:
tableoid | name | altitude
-−-−-−-−-−+-−-−-−-−-−-+-−-−-−-−-−
139793 | Las Vegas | 2174
139793 | Mariposa | 1953
139798 | Madison | 845
(如果重新生成这个结果,可能会得到不同的OID数字。)通过与pg_class进行连接可以看到实际的表名:
SELECT p.relname, c.name, c.altitude
FROM cities c, pg_class p
WHERE c.altitude > 500 AND c.tableoid = p.oid;
将会返回:
relname | name | altitude
-−-−-−-−-−+-−-−-−-−-−-+-−-−-−-−-−
cities | Las Vegas | 2174
cities | Mariposa | 1953
capitals | Madison | 845