# 创建表为

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

# 概要

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 ]

# 描述

创建表为创建一个表并用由 a 计算的数据填充它选择命令。表列具有与输出列关联的名称和数据类型选择(除了您可以通过提供新列名的显式列表来覆盖列名)。

创建表为与创建视图有一些相似之处,但实际上完全不同:它创建一个新表并只评估一次查询以填充新表。新表不会跟踪查询的源表的后续更改。相反,视图重新评估其定义选择查询时声明。

创建表为需要创建对用于表的架构的特权。

# 参数

全球的要么当地的

为了兼容性而忽略。不推荐使用这些关键字;参考创建表详情。

暂时的要么温度

如果指定,则将该表创建为临时表。参考创建表详情。

未记录

如果指定,则将该表创建为未记录的表。参考创建表详情。

如果不存在

如果已存在同名关系,则不要抛出错误。在这种情况下发出通知。参考创建表详情。

表名

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

列名

新表中列的名称。如果未提供列名,则它们取自查询的输出列名。

使用 *方法*

此可选子句指定用于存储新表内容的表访问方法;该方法需要是类型的访问方法桌子.看第61章了解更多信息。如果未指定此选项,则为新表选择默认表访问方法。看默认_桌子_使用权_方法了解更多信息。

和 ( *存储参数* [= *价值*] [, ... ])

该子句指定新表的可选存储参数;看存储参数在里面创建表文档以获取更多信息。为了向后兼容表的子句还可以包括OIDS=假指定新表的行不应包含 OID(对象标识符),OIDS=真不再支持。

没有 OID

这是用于声明表的向后兼容语法没有 OID, 创建一个表与 OIDS不再支持。

提交时

事务块末尾的临时表的行为可以通过使用来控制提交时.这三个选项是:

保留行

交易结束时不采取特殊行动。这是默认行为。

删除行

临时表中的所有行将在每个事务块结束时被删除。本质上,一个自动截短在每次提交时完成。

降低

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

表空间 *表空间名称*

这*表空间名称*是要在其中创建新表的表空间的名称。如果没有指定,默认_表空间被咨询,或温度_表空间如果表是临时的。

询问

一种选择,桌子, 要么价值观命令,或执行运行准备好的命令选择,桌子, 或者价值观询问。

有 [ 无 ] 数据

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

# 笔记

此命令在功能上类似于选择进入,但它是首选,因为它不太可能与其他用途混淆选择进入句法。此外,创建表为提供了由选择进入.

# 例子

创建一个新表电影_最近仅由表中的最近条目组成电影

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

要完全复制表格,使用桌子也可以使用命令:

CREATE TABLE films2 AS
  TABLE 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');

# 兼容性

创建表为符合 SQL 标准。以下是非标准扩展:

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

  • 在标准中,有 [ 无 ] 数据条款是必需的;在 PostgreSQL 中它是可选的。

  • PostgreSQL 处理临时表的方式与标准不同;看创建表详情。

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

  • 表空间的 PostgreSQL 概念不是标准的一部分。因此,该条款表空间是一个扩展。

# 也可以看看

创建物化视图,创建表,执行,选择,选择进入,价值观