CREATE TABLE AS — 從查詢結果定義一個新表格
CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXISTS ]table_name
[ (column_name
[, ...] ) ] [ USINGmethod
] [ WITH (storage_parameter
[=value
] [, ... ] ) | WITHOUT OIDS ] [ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ] [ TABLESPACEtablespace_name
] ASquery
[ WITH [ NO ] DATA ]
CREATE TABLE AS
建立一個表格,並使用 SELECT
指令計算出的資料填入該表格。表格的欄位名稱和資料類型與 SELECT
的輸出欄位相關聯(除非您透過提供明確的新欄位名稱列表來覆寫欄位名稱)。
CREATE TABLE AS
與建立視觀表有些相似,但實際上卻截然不同:它會建立一個新的表格,並僅執行一次查詢來初始化該新表格。新表格不會追蹤查詢來源表格的後續變更。相反地,視觀表會在每次查詢時重新評估其定義的 SELECT
陳述式。
CREATE TABLE AS
需要在用於表格的綱要上擁有 CREATE
權限。
GLOBAL
或 LOCAL
為了相容性而忽略。建議停用這些關鍵字;詳細資訊請參閱 CREATE TABLE。
TEMPORARY
或 TEMP
如果指定,表格會建立為暫存表格。詳細資訊請參閱 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
SELECT
、TABLE
或 VALUES
指令,或是執行準備好的 SELECT
、TABLE
或 VALUES
查詢的 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
子句是一個擴充功能。
如果您在文件中發現任何不正確、與特定功能的體驗不符或需要進一步澄清的地方,請使用 此表格 報告文件問題。