CREATE TABLE AS — 問い合わせの結果によって新しいテーブルを定義する
CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXISTS ]table_name
[ (column_name
[, ...] ) ] [ WITH (storage_parameter
[=value
] [, ... ] ) | WITH OIDS | WITHOUT OIDS ] [ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ] [ TABLESPACEtablespace_name
] ASquery
[ WITH [ NO ] DATA ]
CREATE TABLE AS
はテーブルを作成し、SELECT
コマンドによって算出されたデータをそのテーブルに格納します。
テーブルの列は、SELECT
の出力列に結び付いた名前とデータ型を持ちます(ただし、新しい列名を明示したリストを渡すと、この列名を上書きすることができます)。
CREATE TABLE AS
はビューの作成と似ていますが、実際にはまったく異なります。
CREATE TABLE AS
は新しいテーブルを作成し、新しいテーブルの内容を初期化するために一度だけ問い合わせを評価します。
それ以降に行われた、問い合わせの元テーブルに対する変更は、新しいテーブルには反映されません。
反対に、ビューは問い合わせの度に定義されたSELECT
文を再評価します。
GLOBAL
またはLOCAL
互換性を保持するためのキーワードで、無視されます。 これらのキーワードの使用は廃止予定です。 詳細についてはCREATE TABLEを参照してください。
TEMPORARY
またはTEMP
指定された場合、テーブルは一時テーブルとして作成されます。 詳細についてはCREATE TABLEを参照してください。
UNLOGGED
指定された場合、テーブルはログを取らないテーブルとして作成されます。 詳細についてはCREATE TABLEを参照してください。
IF NOT EXISTS
同じ名前のリレーションが既に存在する場合にエラーとしません。 この場合、注意が発行されます。 詳しくはCREATE TABLEを参照してください。
table_name
作成するテーブルの名前です(スキーマ修飾名も可)。
column_name
新しいテーブルにおける列の名前です。 列名を指定しない場合は、問い合わせの出力列名を利用します。
WITH ( storage_parameter
[= value
] [, ... ] )
この句は、新しいテーブル用の格納パラメータ(省略可能)を指定します。
詳細は格納パラメータを参照してください。
WITH
には、OIDS=TRUE
(もしくは単なるOIDS
)を含めて、新しいテーブルの行が行に割り当てられたOID(オブジェクト識別子)を持たなければならないことを指定することもできます。
また、OIDS=FALSE
を含めて、OIDを持たないことを指定することもできます。
詳細はCREATE TABLEを参照してください。
WITH OIDS
WITHOUT OIDS
これらは古い構文で、それぞれWITH (OIDS)
とWITH (OIDS=FALSE)
と同じです。
OIDS
と格納パラメータの設定の両方を指定したい場合、上記のWITH ( ... )
構文を使用しなければなりません。
ON COMMIT
トランザクションブロックの終了時の一時テーブルの動作をON COMMIT
を使用して制御することができます。
以下の3つのオプションがあります。
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
が提供する機能のスーパーセットを提供します。
CREATE TABLE AS
コマンドでは、OIDを含めるかどうかを明示的に指定できます。
OIDの有無を明示していない場合、設定変数default_with_oidsが使用されます。
films
の最近の項目のみから構成される、新しいテーブルfilms_recent
を作成します。
CREATE TABLE films_recent AS SELECT * FROM films WHERE date_prod >= '2002-01-01';
テーブルを完全に複製するために、TABLE
コマンドを使った短縮形も使用することができます。
CREATE TABLE films2 AS TABLE films;
プリペアド文を使用して、films
内の最近の項目のみから構成される一時テーブルfilms_recent
を作成します。
この新しいテーブルはOIDを持ち、コミット時に削除されます。
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では省略可能です。
PostgreSQLの一時テーブルの扱いは標準とは異なります。 詳細はCREATE TABLEを参照してください。
WITH
句はPostgreSQLの拡張です。
格納パラメータもOIDも標準にはありません。
PostgreSQLのテーブル空間という概念は標準にはありません。
したがって、TABLESPACE
句は拡張です。