CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE table_name [ (column_name [, ...] ) ] [ WITH ( storage_parameter [= value] [, ... ] ) | WITH OIDS | WITHOUT OIDS ] [ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ] [ TABLESPACE tablespace_name ] AS query [ WITH [ NO ] DATA ]
CREATE TABLE ASはテーブルを作成し、SELECT コマンドによって算出されたデータをそのテーブルに格納します。 テーブルの列は、SELECTの出力列に結び付いた名前とデータ型を持ちます(ただし、新しい列名を明示したリストを渡すと、この列名を上書きすることができます)。
CREATE TABLE ASはビューの作成と似ていますが、実際にはまったく異なります。 CREATE TABLE ASは新しいテーブルを作成し、新しいテーブルの内容を初期化するために一度だけ問い合わせを評価します。 それ以降に行われた、問い合わせの元テーブルに対する変更は、新しいテーブルには反映されません。 反対に、ビューは問い合わせの度に定義されたSELECT文を再評価します。
互換性を保持するためのキーワードで、無視されます。 これらのキーワードの使用は廃止予定です。 詳細についてはCREATE TABLEを参照してください。
指定された場合、テーブルは一時テーブルとして作成されます。 詳細についてはCREATE TABLEを参照してください。
指定された場合、テーブルはログを取らないテーブルとして作成されます。 詳細についてはCREATE TABLEを参照してください。
作成するテーブルの名前です(スキーマ修飾名も可)。
新しいテーブルにおける列の名前です。 列名を指定しない場合は、問い合わせの出力列名を利用します。
この句は、新しいテーブル用の格納パラメータ(省略可能)を指定します。 詳細は格納パラメータを参照してください。 WITHには、OIDS=TRUE(もしくは単なるOIDS)を含めて、新しいテーブルの行が行に割り当てられたOID(オブジェクト識別子)を持たなければならないことを指定することもできます。 また、OIDS=FALSEを含めて、OIDを持たないことを指定することもできます。 詳細はCREATE TABLEを参照してください。
これらは古い構文で、それぞれWITH (OIDS)とWITH (OIDS=FALSE)と同じです。 OIDSと格納パラメータの設定の両方を指定したい場合、上記のWITH ( ... )構文を使用しなければなりません。
トランザクションブロックの終了時の一時テーブルの動作をON COMMITを使用して制御することができます。 以下の3つのオプションがあります。
トランザクションの終了時に特別な処理は何も行われません。 これがデフォルトの動作です。
各トランザクションブロックの終了時に、一時テーブルのすべての行が削除されます。 本質的には、コミット毎に自動的にTRUNCATEが行われます。
現在のトランザクションブロックの終了時に一時テーブルは削除されます。
tablespace_nameは、新しいテーブルの作成先となるテーブル空間名です。 指定がなければ、default_tablespace、一時テーブルの場合はtemp_tablespacesが考慮されます。
SELECT、TABLE、VALUESコマンドまたは、あらかじめ準備されたSELECT、TABLEまたはVALUES問い合わせを実行するEXECUTEコマンドです。
この句は問い合わせで生成されるデータを新しいテーブルにコピーすべきかどうかを指定します。 コピーしない場合はテーブル構造のみがコピーされます。 デフォルトではデータをコピーします。
このコマンドは、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句は拡張です。