支援的版本:目前 (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 的存取方法。請參閱 第 61 章 以取得更多資訊。如果未指定此選項,則會為新表格選擇預設的表格存取方法。請參閱 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 子句是一個擴充功能。

提交更正

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