2025年9月25日: PostgreSQL 18 釋出!
支援的版本: 當前 (18) / 17 / 16 / 15 / 14 / 13
開發版本: devel
不支援的版本: 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2 / 7.1

CREATE TABLE AS

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 ]

描述

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 型別的訪問方法。有關更多資訊,請參閱 第 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

一個 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 子句是一個擴充套件。

提交更正

如果您在文件中發現任何不正確、與您對特定功能的使用經驗不符或需要進一步澄清的內容,請使用 此表單 來報告文件問題。