PostgreSQL 中文参考文档
🌐 英文原版 官方 ↗

CREATE TABLE AS

CREATE TABLE AS — 根据查询结果定义一个新表

Synopsis

CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXISTS ] table_name
    [ (column_name [, ...] ) ]
    [ USING method ]
    [ WITH ( storage_parameter [= value] [, ... ] ) | 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 语句求值。

CREATE TABLE AS 要求在用于该表的模式上拥有 CREATE 特权。

参数

GLOBAL or LOCAL

为兼容性而被忽略。这些关键字已不推荐使用;详情请参见 CREATE TABLE。

TEMPORARY or TEMP

如果指定,该表将被创建为临时表。详情请参见 CREATE TABLE。

UNLOGGED

如果指定,该表将被创建为非日志表。详情请参见 CREATE TABLE。

IF NOT EXISTS

如果已经存在同名的关系,则不抛出错误;只是发出一个通知,并保持该表不变。

table_name

要创建的表的名称(可选带模式限定)。

column_name

新表中某一列的名称。如果不提供列名,则将从查询的输出列名中取得列名。

USING method

该可选子句指定用于存储新表内容的表访问方法;该方法必须是 TABLE 类型的访问方法。更多信息请参见 Chapter 62。如果未指定该选项,则会为新表选择默认的表访问方法。更多信息请参见 default_table_access_method。

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

该子句为新表指定可选的存储参数;更多信息请参见 Storage Parameters(在 CREATE TABLE 文档中)。为了向后兼容,表的 WITH 子句还可以包含 OIDS=FALSE,以指定新表的行不应包含 OID(对象标识符);OIDS=TRUE 已不再受支持。

WITHOUT OIDS

这是用于声明表 WITHOUT OIDS 的向后兼容语法;创建 WITH OIDS 的表已不再受支持。

ON COMMIT

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

PRESERVE ROWS

事务结束时不做任何特殊处理。这是默认行为。

DELETE ROWS

临时表中的所有行将在每个事务块结束时被删除。实质上,就是在每次提交时自动执行一次 TRUNCATE。

DROP

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

TABLESPACE tablespace_name

tablespace_name 是要在其中创建新表的表空间的名称。如果未指定,则会查阅 default_tablespace;如果该表是临时表,则查阅 temp_tablespaces。

query

一个 SELECT、TABLE 或 VALUES 命令,或者一个 EXECUTE 命令,该命令运行已预备的 SELECT、TABLE 或 VALUES 查询。

WITH [ NO ] DATA

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

注记

该命令在功能上与 SELECT INTO 相似,但更推荐使用本命令,因为它不太容易与 SELECT INTO 语法的其他用法混淆。此外,CREATE TABLE AS 提供了 SELECT INTO 所提供功能的一个超集。

示例

创建一个新表 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 中最近的条目组成。该新表将在提交时被删除:

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

兼容性

CREATE TABLE AS 符合 SQL 标准。以下是非标准扩展:

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

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

  • PostgreSQL 处理临时表的方式与标准有相当大的不同;详情请参见 CREATE TABLE。

  • WITH 子句是 PostgreSQL 的扩展;存储参数并不在标准中。

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

另请参阅

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