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配置变量。而从 PostgreSQL 8.1 起,该变量默认为 false,因此默认行为与 8.0 之前的发行版不再相同。需要在CREATE TABLE AS所创建表中包含 OID 的应用,应显式指定WITH OIDS以确保所需行为。
创建一个新表films_recent,其中只包含表 films中的近期条目:
CREATE TABLE films_recent AS SELECT * FROM films WHERE date_prod >= '2002-01-01';
CREATE TABLE AS符合SQL标准,但有以下例外:
标准要求在子查询子句外围加括号;在 PostgreSQL中,这些括号是可选的。
标准定义了ON COMMIT子句;目前 PostgreSQL尚未实现它。
标准定义了WITH [ NO ] DATA子句;目前 PostgreSQL尚未实现它。 PostgreSQL提供的行为等同于标准中的 WITH DATA情形。
WITH/WITHOUT OIDS是 PostgreSQL的扩展。
PostgreSQL处理临时表的方式与标准有 相当大的不同;详见CREATE TABLE。
译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。