他のバージョンの文書 15 | 14 | 13 | 12 | 11 | 10 | 9.6 | 9.5 | 9.4 | 9.3 | 9.2 | 9.1 | 9.0 | 8.4 | 8.3 | 8.2 | 8.1 | 8.0 | 7.4 | 7.3 | 7.2

CREATE TABLE AS

CREATE TABLE AS — 問い合わせの結果によって新しいテーブルを定義する

概要

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はテーブルを作成し、SELECT コマンドによって算出されたデータをそのテーブルに格納します。 テーブルの列は、SELECTの出力列に結び付いた名前とデータ型を持ちます(ただし、新しい列名を明示したリストを渡すと、この列名を上書きすることができます)。

CREATE TABLE ASはビューの作成と似ていますが、実際にはまったく異なります。 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型のアクセスメソッドであることが必要です。 より詳しい情報は第63章を参照してください。 このオプションが指定されなければ、新しいテーブルに対してはデフォルトのテーブルアクセスメソッドが選ばれます。 より詳しい情報はdefault_table_access_methodを参照してください。

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

この句は、新しいテーブル用の格納パラメータ(省略可能)を指定します。 詳細はCREATE TABLEの文書の格納パラメータを参照してください。 後方互換のため、テーブルに対するWITH句には、OID(オブジェクト識別子)を持たないことを指定するOIDS=FALSEを含めることもできます。OIDS=TRUEは今はもうサポートされていません。

WITHOUT OIDS

これは、テーブルがWITHOUT OIDSであることを宣言する後方互換のための構文で、WITH OIDSであるテーブルを作成することは今はもうサポートされていません。

ON COMMIT

トランザクションブロックの終了時の一時テーブルの動作をON COMMITを使用して制御することができます。 以下の3つのオプションがあります。

PRESERVE ROWS

トランザクションの終了時に特別な処理は何も行われません。 これがデフォルトの動作です。

DELETE ROWS

各トランザクションブロックの終了時に、一時テーブルのすべての行が削除されます。 本質的には、コミット毎に自動的にTRUNCATEが行われます。

DROP

現在のトランザクションブロックの終了時に一時テーブルは削除されます。

TABLESPACE tablespace_name

tablespace_nameは、新しいテーブルの作成先となるテーブル空間名です。 指定がなければ、default_tablespace、一時テーブルの場合はtemp_tablespacesが考慮されます。

query

SELECTTABLEVALUESコマンドまたは、あらかじめ準備されたSELECTTABLEまたはVALUES問い合わせを実行するEXECUTEコマンドです。

WITH [ NO ] DATA

この句は問い合わせで生成されるデータを新しいテーブルにコピーすべきかどうかを指定します。 コピーしない場合はテーブル構造のみがコピーされます。 デフォルトではデータをコピーします。

注釈

このコマンドは、SELECT INTOと同等の機能を持ちますが、SELECT INTO構文の他の使用方法と混乱する可能性が少ないため、こちらを使用する方が良いでしょう。 さらに、CREATE TABLE ASは、SELECT INTOが提供する機能のスーパーセットを提供します。

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を作成します。 この新しいテーブルはコミット時に削除されます。

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句は拡張です。

関連項目

CREATE MATERIALIZED VIEW, CREATE TABLE, EXECUTE, SELECT, SELECT INTO, VALUES