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
型別的訪問方法。有關更多資訊,請參閱 第 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
命令,或者一個執行準備好的 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
子句是一個擴充套件。
如果您在文件中發現任何不正確、與您對特定功能的使用經驗不符或需要進一步澄清的內容,請使用 此表單 來報告文件問題。