↑↓ 选择 ↵ 打开 ⌫ 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

百科 / SQL 命令 / 表与视图

SQL COMMAND · 表与视图

CREATE TABLE AS

根据查询结果定义一个新表

define a new table from the results of a query

CREATE表与视图引入 6.4(基线)现存至 20 devel11 次语法变更

动词
CREATE
对象
TABLE AS
引入版本
6.4(基线)
状态
现存
语法变更次数
11
手册小节数
6

本站手册 · 18官方文档 ↗

版本轨迹

相对 PostgreSQL 17 语法未变,正文有更新。

语法铁道图 PostgreSQL 18

沿轨道从左向右阅读,分岔表示选择,绕行表示可选,回环表示重复。方框为参数,点击带下划线的参数可展开子规则。

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 [ [ 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 ]

PostgreSQL 18 手册 · 查看完整参考页

描述

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

CREATE TABLE AS 与创建视图有些相似,但实际上差异很大:它会创建一个新表,并且只执行一次该查询来完成新表的初始填充。这个新表不会跟踪该查询所引用源表的后续变化。相比之下,视图每次被查询时都会重新执行其定义中的 SELECT 语句。

CREATE TABLE AS 要求在用于该表的模式上具有 CREATE 权限。

参数

GLOBAL 或 LOCAL

出于兼容性考虑,这些关键字会被忽略。它们的用法已废弃;详见 CREATE TABLE。

TEMPORARY 或 TEMP

如果指定,将把该表创建为临时表。详见 CREATE TABLE。

UNLOGGED

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

IF NOT EXISTS

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

table_name

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

column_name

新表中某一列的名称。如果未提供列名,则采用查询输出列的列名。

USING method

这个可选子句指定用于存储新表内容的表访问方法;该方法必须是 TABLE 类型的访问方法。详见第 62 章。如果未指定此选项,则会为新表选择默认的表访问方法。详见 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

一个 SELECT、TABLE 或 VALUES 命令,或者一个 EXECUTE 命令,用于执行一条已预备的 SELECT、TABLE 或 VALUES 查询。

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 子句是一种扩展。

另见

语法演化

相邻大版本之间的差异,新的在前。版本号链接到对应快照。

  1. PostgreSQL 19← 18语法变化

    + CREATE [ persistence_mode ] TABLE [ IF NOT EXISTS ] table_name+ { [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } } | UNLOGGED− CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXISTS ] table_name
  2. PostgreSQL 18← 17正文更新

    正文更新
  3. PostgreSQL 17← 16正文更新

    正文更新
  4. PostgreSQL 15← 14正文更新

    正文更新
  5. PostgreSQL 14← 13正文更新

    正文更新
  6. PostgreSQL 13← 12正文更新

    正文更新
  7. PostgreSQL 12← 11语法变化

    + [ USING method ]+ [ WITH ( storage_parameter [= value] [, ... ] ) | WITHOUT OIDS ]− [ WITH ( storage_parameter [= value] [, ... ] ) | WITH OIDS | WITHOUT OIDS ]正文更新
  8. PostgreSQL 10← 9.6正文更新

    正文更新
  9. PostgreSQL 9.5← 9.4语法变化

    + CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXISTS ] table_name正文更新
  10. PostgreSQL 9.4← 9.3正文更新

    正文更新
  11. PostgreSQL 9.3← 9.2正文更新

    正文更新
  12. PostgreSQL 9.2← 9.1语法变化

    + [ TABLESPACE tablespace_name ]− [ TABLESPACE tablespace ]正文更新
  13. PostgreSQL 9.1← 9.0语法变化

    + CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE table_name正文更新
  14. PostgreSQL 8.4← 8.3语法变化

    + [ WITH [ NO ] DATA ]正文更新
  15. PostgreSQL 8.3← 8.2正文更新

    正文更新
  16. PostgreSQL 8.2← 8.1语法变化

    + [ WITH ( storage_parameter [= value] [, ... ] ) | WITH OIDS | WITHOUT OIDS ]+ [ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ]+ [ TABLESPACE tablespace ]− [ (column_name [, ...] ) ] [ [ WITH | WITHOUT ] OIDS ]正文更新
  17. PostgreSQL 8.1← 8.0正文更新

    正文更新
  18. PostgreSQL 8.0← 7.4语法变化

    + CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } ] TABLE table_name [ (column_name [, ...] ) ] [ [ WITH | WITHOUT ] OIDS ]正文更新
  19. PostgreSQL 7.4← 7.3语法变化

    + CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } ] TABLE table_name [ (column_name [, ...] ) ]正文更新
  20. PostgreSQL 7.3← 7.2正文更新

    正文更新
  21. PostgreSQL 7.2← 7.1语法变化

    + CREATE [ [ LOCAL ] { TEMPORARY | TEMP } ] TABLE table_name [ (column_name [, ...] ) ]+ AS query− CREATE [ TEMPORARY | TEMP ] TABLE table [ (column [, ...] ) ]− AS select_clause正文更新
  22. PostgreSQL 7.1← 7.0语法变化

    sql-createtableas.htm → sql-createtableas.html

    + CREATE [ TEMPORARY | TEMP ] TABLE table [ (column [, ...] ) ]正文更新
  23. PostgreSQL 7.0← 6.5新增此命令

  24. PostgreSQL 6.5← 6.4移除此命令

同组命令

命令动词对象版本变动最近变更
TABLES & VIEWS表与视图15 条↑
TRUNCATETRUNCATE— 8.43 次
清空一个表或一组表现存
CREATE MATERIALIZED VIEWCREATEMATERIALIZED VIEW 122 次
定义一个新物化视图现存
ALTER MATERIALIZED VIEWALTERMATERIALIZED VIEW 168 次
更改一个物化视图的定义现存
DROP MATERIALIZED VIEWDROPMATERIALIZED VIEW —
移除一个物化视图现存
REFRESH MATERIALIZED VIEWREFRESHMATERIALIZED VIEW 9.41 次
替换物化视图的内容现存
CREATE SEQUENCECREATESEQUENCE 188 次
定义一个新的序列发生器现存
ALTER SEQUENCEALTERSEQUENCE 1810 次
更改序列发生器的定义现存
DROP SEQUENCEDROPSEQUENCE 8.23 次
移除一个序列现存
CREATE TABLECREATETABLE 1920 次
定义一个新表现存
ALTER TABLEALTERTABLE 1826 次
更改一个表的定义现存
DROP TABLEDROPTABLE 8.23 次
移除一个表现存
CREATE TABLE ASCREATETABLE AS 1911 次
根据查询结果定义一个新表现存
CREATE VIEWCREATEVIEW 9.47 次
定义一个新视图现存
ALTER VIEWALTERVIEW 145 次
更改视图的定义现存
DROP VIEWDROPVIEW 8.24 次
移除一个视图现存