Redrock Postgres 搜索 英文
版本: 9.3 / 9.4 / 9.5 / 9.6 / 10 / 11 / 12 / 13 / 14 / 15 / 16 / 17

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 权限。

参数

GLOBALLOCAL

出于兼容性目的而忽略。这些关键字已被弃用;有关详细信息,请参阅 CREATE TABLE

TEMPORARYTEMP

如果指定,则该表会创建为临时表。有关详细信息,请参阅 CREATE TABLE

UNLOGGED

如果指定,则该表会创建为未记录表。有关详细信息,请参阅 CREATE TABLE

IF NOT EXISTS

如果已存在同名关系,则不会引发错误;只需发出通知并使该表保持不变。

table_name

要创建的表的名称(可以选择加入模式限定)。

column_name

新表中列的名称。如果没有提供列名称,则会从查询的输出列名称获取这些名称。

USING method

此可选子句指定要用于存储新表内容的表访问方法;该方法需要是类型为 TABLE 的访问方法。有关更多信息,请参见 第 61 章。如果未指定此选项,则会为新表选择默认表访问方法。有关更多信息,请参阅 default_table_access_method

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

此子句指定新表的可选存储参数;有关更多信息,请参见 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

一个 SELECTTABLEVALUES 命令,或一个运行已准备好的 SELECTTABLEVALUES 查询的 EXECUTE 命令。

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 VIEWCREATE TABLEEXECUTESELECTSELECT INTOVALUES