CREATE TABLE AS

Name

CREATE TABLE AS -- 从一条查询的结果中定义一个新表

Synopsis

CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } ] TABLE table_name
    [ (column_name [, ...] ) ]
    [ WITH ( storage_parameter [= value] [, ... ] ) | WITH OIDS | WITHOUT OIDS ]
    [ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ]
    [ TABLESPACE tablespace ]
    AS query
    [ WITH [ NO ] DATA ]

描述

CREATE TABLE AS创建一个表并且用来自SELECT命令的结果填充该表。 该表的字段和SELECT输出字段的名字及类型相关。 不过你可以通过明确地给出一个字段名字列表来覆盖 SELECT输出字段的名字。

CREATE TABLE AS和创建视图有点像,不过两者之间实在是差异很大: 它创建一个新表并且只对查询计算一次来填充这个新表。新表不能跟踪源表的变化。 相比之下,每次做查询的时候,视图都重新计算定义它的SELECT语句。

参数

GLOBAL or LOCAL

忽略。仅仅为了兼容性而存在。请参考CREATE TABLE获取细节。

TEMPORARY or TEMP

如果声明了这个选项,则该表作为临时表创建。 参阅CREATE TABLE获取细节。

table_name

要创建的表名(可以用模式修饰)

column_name

字段的名称。如果没有提供字段名字,那么就从查询的输出字段名中获取。 如果表是从一个EXECUTE命令创建的,那么就不能声明字段名列表。

WITH ( storage_parameter [= value] [, ... ] )

这个子句为新表指定了可选的存储参数;参见存储参数获取更多信息。 WITH子句还可以包含OIDS=TRUEOIDS来为新表中的行分配和存储OID(对象表示符); 或者用OIDS=FALSE表示不分配OID 。参见CREATE TABLE获取更多信息。

WITH OIDS
WITHOUT OIDS

These are obsolescent syntaxes equivalent to WITH (OIDS) and WITH (OIDS=FALSE), respectively. If you wish to give both an OIDS setting and storage parameters, you must use the WITH ( ... ) syntax; see above.

这些是反对使用的、分别等价于WITH (OIDS)WITH (OIDS=FALSE)的语法。如果你想给定 OIDS设置和存储参数,你必须使用 WITH ( ... )语法;见上面。

ON COMMIT

使用ON COMMIT控制临时表在事务块结尾的行为。可用的三个选项如下:

PRESERVE ROWS

不采取任何特别的动作,这是缺省。

DELETE ROWS

删除临时表中的所有行。本质上是在每次提交事务后自动执行一个TRUNCATE命令。

DROP

在目前事务块结尾删除临时表

TABLESPACE tablespace

The tablespace is the name of the tablespace in which the new table is to be created. If not specified, default_tablespace is consulted, or temp_tablespaces if the table is temporary.

指定新表将要在tablespace表空间内创建。 如果没有声明,将查询default_tablespace, 如果表为空,那么将查询temp_tablespaces

query

一个SELECTTABLE, 或者VALUES命令或者一个运行预备好的SELECTTABLE或者VALUES查询的EXECUTE命令。

WITH [ NO ] DATA

该语句声明查询产生的数据是否应该被复制到新表中。若没有,则 仅仅复制了标准结构。默认是复制数据。

注意

这条命令在功能上等效于SELECT INTO,但是更建议你用这个命令, 因为它不太可能和SELECT INTO语法的其它方面混淆。 另外,CREATE TABLE AS提供了SELECT INTO功能的超集。

PostgreSQL之前,CREATE TABLE AS总是在它创建的表中包含OID , 而在PostgreSQL里,CREATE TABLE AS命令允许明确声明是否应该包含OID。 如果没有明确声明是否应该包含OID,那么使用配置变量default_with_oids的设置。 到了PostgreSQL8.1 这个变量缺省为假,缺省行为和8.0之前的版本不同。 因此,那些要求CREATE TABLE AS创建的表包含OID的应用应该明确声明WITH (OIDS)以确保正确的行为。

例子

创建一个只包含表films中最近的记录的新表films_recent

CREATE TABLE films_recent AS
  SELECT * FROM films WHERE date_prod >= '2002-01-01';

完全复制一个表,使用TABLE的简短形式也可以被使用:

CREATE TABLE films2 AS
  TABLE films;

使用预备语句创建一个只包含表films中最近的记录的新临时表films_recent, 该临时表包含OID并且在事务结束时将被删除:

PREPARE recentfilms(date) AS
  SELECT * FROM films WHERE date_prod > $1;
CREATE TEMP TABLE films_recent WITH (OIDS) ON COMMIT DROP AS
  EXECUTE recentfilms('2002-01-01');

兼容性

CREATE TABLE AS兼容SQL标准, 以下是非标准扩展:

又见

CREATE TABLE, EXECUTE, SELECT, SELECT INTO, VALUES