?
本文檔使用 PHP中文網(wǎng)手冊 發(fā)布
CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } ] TABLE table_name [ (column_name [, ...] ) ] [ WITH ( storage_parameter [= value] [, ... ] ) | WITH OIDS | WITHOUT OIDS ] [ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ] [ TABLESPACE tablespace ] AS query [ WITH [ NO ] DATA ]
CREATE TABLE AS創(chuàng)建一個表并且用來自SELECT命令的結(jié)果填充該表。 該表的字段和SELECT輸出字段的名字及類型相關(guān)。 不過你可以通過明確地給出一個字段名字列表來覆蓋 SELECT輸出字段的名字。
CREATE TABLE AS和創(chuàng)建視圖有點像,不過兩者之間實在是差異很大: 它創(chuàng)建一個新表并且只對查詢計算一次來填充這個新表。新表不能跟蹤源表的變化。 相比之下,每次做查詢的時候,視圖都重新計算定義它的SELECT語句。
忽略。僅僅為了兼容性而存在。請參考CREATE TABLE獲取細節(jié)。
如果聲明了這個選項,則該表作為臨時表創(chuàng)建。 參閱CREATE TABLE獲取細節(jié)。
要創(chuàng)建的表名(可以用模式修飾)
字段的名稱。如果沒有提供字段名字,那么就從查詢的輸出字段名中獲取。 如果表是從一個EXECUTE命令創(chuàng)建的,那么就不能聲明字段名列表。
這個子句為新表指定了可選的存儲參數(shù);參見存儲參數(shù)獲取更多信息。 WITH子句還可以包含OIDS=TRUE或OIDS來為新表中的行分配和存儲OID(對象表示符); 或者用OIDS=FALSE表示不分配OID 。參見CREATE TABLE獲取更多信息。
These are obsolescent syntaxes equivalent to WITH (OIDS) and WITH (OIDS=FALSE), respectively. If you wish to give both an OIDS setting and storage parameters, you must use the WITH ( ... ) syntax; see above.
這些是反對使用的、分別等價于WITH (OIDS) 和WITH (OIDS=FALSE)的語法。如果你想給定 OIDS設(shè)置和存儲參數(shù),你必須使用 WITH ( ... )語法;見上面。
使用ON COMMIT控制臨時表在事務(wù)塊結(jié)尾的行為。可用的三個選項如下:
不采取任何特別的動作,這是缺省。
刪除臨時表中的所有行。本質(zhì)上是在每次提交事務(wù)后自動執(zhí)行一個TRUNCATE命令。
在目前事務(wù)塊結(jié)尾刪除臨時表
The tablespace is the name of the tablespace in which the new table is to be created. If not specified, default_tablespace is consulted, or temp_tablespaces if the table is temporary.
指定新表將要在tablespace表空間內(nèi)創(chuàng)建。 如果沒有聲明,將查詢default_tablespace, 如果表為空,那么將查詢temp_tablespaces。
一個SELECT,TABLE, 或者VALUES命令或者一個運行預(yù)備好的SELECT,TABLE或者VALUES查詢的EXECUTE命令。
該語句聲明查詢產(chǎn)生的數(shù)據(jù)是否應(yīng)該被復(fù)制到新表中。若沒有,則 僅僅復(fù)制了標準結(jié)構(gòu)。默認是復(fù)制數(shù)據(jù)。
這條命令在功能上等效于SELECT INTO,但是更建議你用這個命令, 因為它不太可能和SELECT INTO語法的其它方面混淆。 另外,CREATE TABLE AS提供了SELECT INTO功能的超集。
在PostgreSQL之前,CREATE TABLE AS總是在它創(chuàng)建的表中包含OID , 而在PostgreSQL里,CREATE TABLE AS命令允許明確聲明是否應(yīng)該包含OID。 如果沒有明確聲明是否應(yīng)該包含OID,那么使用配置變量default_with_oids的設(shè)置。 到了PostgreSQL8.1 這個變量缺省為假,缺省行為和8.0之前的版本不同。 因此,那些要求CREATE TABLE AS創(chuàng)建的表包含OID的應(yīng)用應(yīng)該明確聲明WITH (OIDS)以確保正確的行為。
創(chuàng)建一個只包含表films中最近的記錄的新表films_recent:
CREATE TABLE films_recent AS SELECT * FROM films WHERE date_prod >= '2002-01-01';
完全復(fù)制一個表,使用TABLE的簡短形式也可以被使用:
CREATE TABLE films2 AS TABLE films;
使用預(yù)備語句創(chuàng)建一個只包含表films中最近的記錄的新臨時表films_recent, 該臨時表包含OID并且在事務(wù)結(jié)束時將被刪除:
PREPARE recentfilms(date) AS SELECT * FROM films WHERE date_prod > $1; CREATE TEMP TABLE films_recent WITH (OIDS) ON COMMIT DROP AS EXECUTE recentfilms('2002-01-01');
CREATE TABLE AS兼容SQL標準, 以下是非標準擴展:
標準要求在子查詢子句周圍有圓括弧,在 PostgreSQL里,這些圓括弧是可選的。
在標準中,需要WITH [ NO ] DATA子句; 在PostgreSQL中是可選的。
標準需要一個WITH [ NO ] DATA子句;在PostgreSQL里是可選的。
PostgreSQL處理臨時表的方法和標準相差較大; 參閱CREATE TABLE獲取細節(jié)。
WITH子句是PostgreSQL擴展, 并且SQL標準中也沒有存儲參數(shù)和OID 。
PostgreSQL表空間的概念也不是標準的一部分。 因此TABLESPACE子句也是擴展。