PostgreSQL CREATE TABLE AS

2021-09-10 13:39 更新

CREATE TABLE AS — 從一個查詢的結(jié)果創(chuàng)建一個新表

大綱

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創(chuàng)建一個表,并且用 由一個SELECT命令計算出來的數(shù)據(jù)填充 該表。該表的列具有和SELECT的輸出列 相關(guān)的名稱和數(shù)據(jù)類型(不過可以通過給出一個顯式的新列名列表來覆 蓋這些列名)。

CREATE TABLE AS和創(chuàng)建一個視圖有些 相似,但是實際上非常不同:它會創(chuàng)建一個新表并且只計算該查詢一次 用來初始填充新表。這個新表將不會跟蹤該查詢源表的后續(xù)變化。相反, 一個視圖只要被查詢,它的定義SELECT 語句就會被重新計算。

參數(shù)

GLOBAL或者LOCAL

為兼容性而忽略。不推薦使用這些關(guān)鍵詞,詳見 CREATE TABLE。

TEMPORARY或者TEMP

如果被指定,該表會被創(chuàng)建為一個臨時表。詳見 CREATE TABLE

UNLOGGED

如果被指定,該表會被創(chuàng)建為一個不做日志的表。詳見 CREATE TABLE

IF NOT EXISTS

如果已經(jīng)存在一個同名的關(guān)系時不要拋出錯誤。這種情況下會發(fā)出一個 提示。詳見CREATE TABLE

table_name

要創(chuàng)建的表的名稱(可以被模式限定)。

column_name

新表中一列的名稱。如果沒有提供列名,會從查詢的輸出列名中得到。

USING method

這個可選的子句指定了用于存儲新表內(nèi)容的表訪問方法;該方法需要是一個類型 TABLE的訪問方法。詳見第 60 章。 如果沒有指定這個選項,則選擇新表的默認(rèn)表訪問方法。詳見default_table_access_method。

WITH ( storage_parameter [= value] [, ... ] )

這個子句為新表指定可選的存儲參數(shù),詳見CREATE TABLE中的 Storage Parameters。 為了向后兼容,表的WITH子句也能包含OIDS=FALSE來指定新表的行將不包含OID(對象標(biāo)識符)。OIDS=TRUE不再支持。

WITHOUT OIDS

這是向后兼容的語法,用于聲明表WITHOUT OIDS,創(chuàng)建表WITH OIDS不再被支持。

ON COMMIT

臨時表在事務(wù)塊結(jié)束時的行為可以用ON COMMIT 控制。三個選項是:

PRESERVE ROWS

在事務(wù)結(jié)束時不采取特殊的動作。這是默認(rèn)行為。

DELETE ROWS

在每一個事務(wù)塊結(jié)束時臨時表中的所有行都將被刪除。本質(zhì)上, 在每次提交時會完成一次自動的TRUNCATE。

DROP

在當(dāng)前事務(wù)塊結(jié)束時將刪掉臨時表。

TABLESPACE tablespace_name

tablespace_name 是要在其中創(chuàng)建新表的表空間名稱。如果沒有指定,將會查詢 default_tablespace,臨時表會查詢 temp_tablespaces。

query

一個SELECTTABLE或者VALUES 命令,或者是一個運行準(zhǔn)備好的 SELECT、 TABLE或者 VALUES查詢的EXECUTE命令。

WITH [ NO ] DATA

這個子句指定查詢產(chǎn)生的數(shù)據(jù)是否應(yīng)該被復(fù)制到新表中。如果不是,只有 表結(jié)構(gòu)會被復(fù)制。默認(rèn)是復(fù)制數(shù)據(jù)。

注解

這個命令在功能上類似于SELECT INTO,但是它更好, 因為不太可能被SELECT INTO語法的其他使用混淆。更 進(jìn)一步,CREATE TABLE AS提供了 SELECT INTO的功能的一個超集。

示例

創(chuàng)建一個新表films_recent,它只由表 films中最近的項組成:

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_recent, 它僅由表films中最近的項組成,使用準(zhǔn)備好的聲明。新表將在提交時被丟棄:

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標(biāo)準(zhǔn)。下面的是非標(biāo)準(zhǔn)擴(kuò)展:

  • 標(biāo)準(zhǔn)要求在子查詢子句周圍有圓括號,在 PostgreSQL中這些圓括號是可選的。

  • 在標(biāo)準(zhǔn)中,WITH [ NO ] DATA子句是必要的,而 PostgreSQL 中是可選的。

  • PostgreSQL處理臨時表的方式和標(biāo)準(zhǔn)不同。 詳見CREATE TABLE。

  • WITH子句是一種 PostgreSQL擴(kuò)展, 標(biāo)準(zhǔn)中沒有存儲參數(shù)。

  • PostgreSQL的表空間概念是標(biāo)準(zhǔn)的 一部分。因此,子句TABLESPACE是一種擴(kuò)展。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號