创建表为

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

Synopsis

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 ]

Description

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

CREATE TABLE AS与创建视图有些相似,但实际上是完全不同的:它创建一个新表并仅对查询进行一次评估以最初填充新表。新表将不会跟踪对查询源表的后续更改。相反,无论何时查询,视图都会重新评估其定义的SELECT语句。

Parameters

  • GLOBALLOCAL

    • 忽略兼容性。不建议使用这些关键字;有关详情,请参阅CREATE TABLE
  • TEMPORARYTEMP

    • 如果指定,该表将被创建为临时表。有关详情,请参阅CREATE TABLE
  • UNLOGGED

    • 如果指定,该表将创建为未记录表。有关详情,请参阅CREATE TABLE
  • IF NOT EXISTS

    • 如果已经存在同名关系,则不要抛出错误。在这种情况下发出通知。有关详情,请参阅CREATE TABLE
  • table_name

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

    • 新表中的列名。如果未提供列名,则它们取自查询的输出列名。
  • WITH ( storage_parameter [= value] [, ... ] )

    • 此子句为新表指定了可选的存储参数。有关更多信息,请参见Storage ParametersWITH子句还可以包含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

    • Transaction 结束时不会采取任何特殊措施。这是默认行为。

    • DELETE ROWS

      • 临时表中的所有行将在每个事务块的末尾删除。本质上,每次提交都会自动执行TRUNCATE
    • DROP

      • 临时表将在当前事务块的末尾删除。
  • TABLESPACE tablespace_name

      • tablespace_name *是要在其中创建新表的表空间的名称。如果未指定,则查询default_tablespace,如果表是临时的,则查询temp_tablespaces
  • query

  • WITH [ NO ] DATA

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

Notes

该命令在功能上类似于SELECT INTO,但是它是首选的,因为它不太可能与SELECT INTO语法的其他用法混淆。此外,CREATE TABLE AS提供SELECT INTO提供的功能的超集。

CREATE TABLE AS命令允许用户明确指定是否应包含 OID。如果未明确指定 OID 的存在,则使用default_with_oids配置变量。

Examples

创建一个仅由表films的最新条目组成的新表films_recent

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

要完全复制表,还可以使用使用TABLE命令的缩写形式:

CREATE TABLE films2 AS
  TABLE films;

使用准备好的语句创建一个仅由表films的最新条目组成的新临时表films_recent。新表具有 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');

Compatibility

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

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

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

  • PostgreSQL 处理临时表的方式与标准完全不同。有关详情,请参见CREATE TABLE

  • WITH子句是 PostgreSQL 扩展;存储参数和 OID 都不在标准中。

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

See Also

创建材料视图, CREATE TABLE, EXECUTE, SELECT, SELECT INTO, VALUES