9.3 9.4 9.5 9.6 10 11 12 13 14 Current(15)
阿里云PostgreSQL 问题报告 纠错本页面

CREATE TABLE AS

CREATE TABLE AS — 从一个查询的结果创建一个新表

大纲

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

描述

CREATE TABLE AS创建一个表,并且用 由一个SELECT命令计算出来的数据填充 该表。该表的列具有和SELECT的输出列 相关的名称和数据类型(不过可以通过给出一个显式的新列名列表来覆 盖这些列名)。

CREATE TABLE AS和创建一个视图有些 相似,但是实际上非常不同:它会创建一个新表并且只计算该查询一次 用来初始填充新表。这个新表将不会跟踪该查询源表的后续变化。相反, 一个视图只要被查询,它的定义SELECT 语句就会被重新计算。

参数

GLOBAL或者LOCAL

为兼容性而忽略。不推荐使用这些关键词,详见 CREATE TABLE

TEMPORARY或者TEMP

如果被指定,该表会被创建为一个临时表。详见 CREATE TABLE

UNLOGGED

如果被指定,该表会被创建为一个不做日志的表。详见 CREATE TABLE

IF NOT EXISTS

如果已经存在一个同名的关系时不要抛出错误。这种情况下会发出一个 提示。详见CREATE TABLE

table_name

要创建的表的名称(可以被模式限定)。

column_name

新表中一列的名称。如果没有提供列名,会从查询的输出列名中得到。

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

这个子句为新表指定可选的存储参数,详见 存储参数WITH子句也能包括OIDS=TRUE(或者只是 OIDS)来指定新表的行应该被分配 OID (对象标识符), 或者包括OIDS=FALSE来指定行没有 OID。详见 CREATE TABLE

WITH OIDS
WITHOUT OIDS

这些是分别等效于WITH (OIDS)WITH (OIDS=FALSE)的即将过时的语法。如果你希望同时 给出OIDS设置和存储参数,你必须使用 WITH ( ... )语法,见上文。

ON COMMIT

临时表在事务块结束时的行为可以用ON COMMIT 控制。三个选项是:

PRESERVE ROWS

在事务结束时不采取特殊的动作。这是默认行为。

DELETE ROWS

在每一个事务块结束时临时表中的所有行都将被删除。本质上, 在每次提交时会完成一次自动的TRUNCATE

DROP

在当前事务块结束时将删掉临时表。

TABLESPACE tablespace_name

tablespace_name 是要在其中创建新表的表空间名称。如果没有指定,将会查询 default_tablespace,临时表会查询 temp_tablespaces

query

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

WITH [ NO ] DATA

这个子句指定查询产生的数据是否应该被复制到新表中。如果不是,只有 表结构会被复制。默认是复制数据。

注解

这个命令在功能上类似于SELECT INTO,但是它更好, 因为不太可能被SELECT INTO语法的其他使用混淆。更 进一步,CREATE TABLE AS提供了 SELECT INTO的功能的一个超集。

CREATE TABLE AS命令允许用户显式地指定 是否应该包括 OID。如果没有显式地指定 OID 的存在,将使用 default_with_oids配置变量来判断。

示例

创建一个新表films_recent,它只由表 films中最近的项组成:

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

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

CREATE TABLE films2 AS
  TABLE films;

用一个预备语句创建一个新的临时表films_recent, 它仅由表films中最近的项组成。新表有 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标准。下面的是非标准扩展:

  • 标准要求在子查询子句周围有圆括号,在 PostgreSQL中这些圆括号是可选的。

  • 在标准中,WITH [ NO ] DATA子句是必要的,而 PostgreSQL 中是可选的。

  • PostgreSQL处理临时表的方式和标准不同。 详见CREATE TABLE

  • WITH子句是一种 PostgreSQL扩展, 标准中既没有存储参数也没有 OID。

  • PostgreSQL的表空间概念是标准的 一部分。因此,子句TABLESPACE是一种扩展。

另见

CREATE MATERIALIZED VIEW, CREATE TABLE, EXECUTE, SELECT, SELECT INTO, VALUES