↑↓ 选择↵ 打开⌫ 切换范围完整搜索

PG.CENTER 连接 PostgreSQL 文档、百科与生态知识。由 Pigsty 维护。

支持中的版本: 当前版本 (18) / 17 / 16 / 15 / 14
开发中的版本: 19 / 20devel
已结束支持的版本: 13 / 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2 / 7.1 / 7.0 / 6.4
历史版本。 PostgreSQL 11 已结束支持。 2023-11-09. 请参阅 当前版本手册.

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

如果指定,该表将创建为不记录 WAL 的表。详见 CREATE TABLE。

IF NOT EXISTS

如果已存在同名关系,则不抛出错误,而是发出一条提示,并保持现有关系不变。

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

可以是 SELECT、TABLE 或 VALUES 命令,也可以是运行已预备的 SELECT、TABLE 或 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 子句是一种扩展。

报告文档问题

阅读 上游文档. 反馈更正前请先核对 当前版本手册.