pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。
CREATE TABLE AS — 根据查询结果定义一个新表
CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } ] TABLE table_name
[ (column_name [, ...] ) ] [ [ WITH | WITHOUT ] OIDS ]
AS query
CREATE TABLE AS创建一个表,并用 SELECT命令或运行已预备的SELECT 命令的EXECUTE计算得到的数据填充该表。该表的列具有 与SELECT输出列对应的名称和数据类型(但可以通过 显式给出新的列名列表来覆盖列名)。
CREATE TABLE AS与创建视图有些 相似,但实际上差异很大:它会创建一个新表,并且只执行一次该查询 来完成新表的初始填充。这个新表不会跟踪该查询所引用源表的后续变 化。 相比之下,视图每次被查询时都会重新执行其定义中的 SELECT语句。
GLOBAL or LOCAL出于兼容性考虑会被忽略。详见 CREATE TABLE。
TEMPORARY or TEMP如果指定,将把该表创建为临时表。详见 CREATE TABLE。
table_name要创建的表名(可选地带模式限定)。
column_name新表中某一列的名称。如果未提供列名,则采用查询输出列的列名。如果表是从 EXECUTE 命令创建的,则不能指定列名列表。
WITH OIDSWITHOUT OIDS这个可选子句指定CREATE TABLE AS创建的表是否应 包含 OID。如果未指定该子句的任何一种形式,则使用 default_with_oids配置参数的值。
query一条查询语句(也就是一个SELECT命令,或一个运行 已预备的SELECT命令的EXECUTE 命令)。所允许语法的描述请分别参阅 SELECT或 EXECUTE。
这个命令在功能上类似于SELECT INTO,但更推荐 使用它,因为它更不容易与SELECT INTO语法的其 他用法相混淆。此外,CREATE TABLE AS提供的功能 是SELECT INTO所提供功能的超集。
在 PostgreSQL 8.0 之前,CREATE TABLE AS创建的表总是包含 OID。从 PostgreSQL 8.0 起,CREATE TABLE AS命令允许用户显式指定是否包含 OID。如果未显式指定是否存在 OID,则使用default_with_oids配置变量。 虽然该变量目前的默认值为 true,但这一默认值将来可能会改变。因此, 需要在CREATE TABLE AS所创建表中包含 OID 的应用,应显式指定WITH OIDS,以确保与未来版本的PostgreSQL兼容。
创建一个新表films_recent,其中只包含表 films中的近期条目:
CREATE TABLE films_recent AS SELECT * FROM films WHERE date_prod >= '2002-01-01';
CREATE TABLE AS由 SQL:2003 标准指定。该命令在 SQL:2003 中的定义与它在 PostgreSQL中的实现之间存在一些小的差异:
标准要求在子查询子句外围加括号;在 PostgreSQL中,这些括号是可选的。
标准定义了ON COMMIT子句;目前 PostgreSQL尚未实现它。
标准定义了WITH DATA子句;目前 PostgreSQL尚未实现它。
译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。