Postgresql的数据库转储使用ALTER TABLE ONLY tablename
而不是我熟悉的ALTER TABLE tablename
。我很好奇ONLY
关键字的作用,所以我在Postgresql documentation中查找了它,并说明了以下内容:
名称
要更改的现有表的名称(可选择模式限定)。如果在表名之前指定了ONLY,则仅更改该表。如果未指定ONLY,则更改表及其所有后代表(如果有)。 (可选)可以在表名后指定*以明确指示包含后代表。
什么是后代表?
答案 0 :(得分:6)
PostgreSQL实现了表继承,这可以是一个有用的工具 对于数据库设计师(SQL:1999及更高版本定义了类型继承 功能,在许多方面与所描述的功能不同 此处。)
让我们从一个例子开始:假设我们正在尝试构建数据 城市模型。每个州都有许多城市,但只有一个城市。我们 希望能够快速检索首都城市 特殊的国家。这可以通过创建两个表来完成,一个用于 州首府和非首都城市。但是,什么 当我们想要询问有关城市的数据时,就会发生这种情况 是否是资本?继承功能可以帮助 解决这个问题。我们定义大写表以便它继承 来自城市:
CREATE TABLE cities (
name text,
population float,
altitude int -- in feet
);
CREATE TABLE capitals (
state char(2)
) INHERITS (cities);
在这种情况下,大写表会继承其所有列 父表,城市。州首府还有一个额外的栏目,州, 这显示了他们的状态。
在PostgreSQL中,表可以从零个或多个其他表继承,以及 查询可以引用表的所有行或a的所有行 表及其所有后代表。后者的行为是 默认值。
来源:https://www.postgresql.org/docs/8.4/static/ddl-inherit.html
答案 1 :(得分:2)
表的后代表是直接或间接来自inherit的表。因此,如果表B
继承表A
,而表C
继承表B
,则:
B
和C
是A
的后代表。C
是B
。对表的查询(没有ONLY
)是对表和所有后代表的查询。因此,例如,具有子代表的表上的SELECT
实际上是该表及其所有后代表的UNION
SELECT ... FROM ONLY
。 (实际上,如果您在具有后代的表上检查SELECT
查询的查询计划,您将看到该计划与此类UNION
查询几乎完全相同。)
如果您不使用表继承,则ONLY
关键字对查询没有影响,因为后代表集为空。