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 ]

Description

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

CREATE TABLE AS 与创建视图有一些相似之处,但实际上有很大不同:它创建了一个新表,并仅计算一次查询以最初填充新表。新表不会跟踪源表的后续更改。相比之下,视图只要查询就会重新计算其定义的 SELECT 语句。

CREATE TABLE AS 要求对用于表的架构有 CREATE 权限。

Parameters

  • GLOBAL or LOCAL

    • 为兼容而忽略。弃用这些关键字的使用;有关详细信息,请参阅 CREATE TABLE

  • TEMPORARY or TEMP

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

  • UNLOGGED

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

  • IF NOT EXISTS

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

  • table_name

    • 要创建的表名(可选地经过架构限定)。

  • column_name

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

  • USING _method_

    • 此可选子句指定用于存储新表内容的表访问方法;该方法需要是类型为 TABLE 的访问方法。有关详细信息,请参阅 Chapter 63 。如果未指定此选项,则为新表选择默认表访问方法。有关详细信息,请参阅 default_table_access_method

  • WITH ( _storage_parameter [= value ] [, …​ ] )_

    • 此子句为新表指定可选的存储参数;有关详细信息,请参阅 CREATE TABLE 文档中的 Storage Parameters 。出于向后兼容性的考虑,表 WITH 的子句也可以包括 OIDS=FALSE ,以指定新表的行不得包含任何 OID(对象标识符),不再支持 OIDS=TRUE

  • WITHOUT OIDS

    • 这是用于声明表 WITHOUT OIDS 的向后兼容语法,不再支持创建表 WITH OIDS

  • ON COMMIT

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

  • TABLESPACE _tablespace_name_

  • query

  • WITH [ NO ] DATA

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

  • PRESERVE ROWS

    • 事务结束时不会执行任何特殊操作。这是默认行为。

  • DELETE ROWS

    • 临时表中的所有行都将在每个事务块的结尾处被删除。基本上,每次提交时都会自动 TRUNCATE

  • DROP

    • 临时表将在当前事务块的结尾处被删除。

Notes

此命令在功能上与 SELECT INTO 类似,但由于不太可能与 SELECT INTO 语法的其他用法混淆,因此更受青睐。此外, CREATE TABLE AS 提供了 SELECT INTO 所提供功能的超集。

Examples

创建新表 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');

Compatibility

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