PostgreSQL 8.4.1文書
前のページ | 巻戻し |  | 早送り | 次のページ

# CREATE TABLE AS

## 名前

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

## 概要

    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 ]
    CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } ] TABLE table_name
        AS query
        [ WITH [ NO ] DATA ]

## 説明

`CREATE TABLE AS`はテーブルを作成し、`SELECT` コマンドによって算出されたデータをそのテーブルに格納します。 テーブルの列は、`SELECT`の出力列に結び付いた名前とデータ型を持ちます（ただし、新しい列名を明示したリストを渡すと、この列名を上書きすることができます）。

`CREATE TABLE AS`はビューの作成と似ていますが、実際にはまったく異なります。 `CREATE TABLE AS`は新しいテーブルを作成し、新しいテーブルの内容を初期化するために一度だけ問い合わせを評価します。 それ以降に行われた、問い合わせの元テーブルに対する変更は、新しいテーブルには反映されません。 反対に、ビューは問い合わせの度に定義された`SELECT`文を再評価します。

## パラメータ

`GLOBAL` or `LOCAL`

  互換性を保持するため、無視されます。 詳細はCREATE TABLEを参照してください。

`TEMPORARY` or `TEMP`

  指定された場合、テーブルは一時テーブルとして作成されます。 詳細はCREATE TABLEを参照してください。

`table_name`

  作成するテーブルの名前です（スキーマ修飾名も可）。

`column_name`

  新しいテーブルにおける列の名前です。 列名を指定しない場合は、問い合わせの出力列名を利用します。 `EXECUTE`コマンドを実行してテーブルを作成する場合は、列名のリストを指定できません。

`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``

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

`query`

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

`WITH [ NO ] DATA`

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

## 注釈

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

PostgreSQL 8.0より前は、`CREATE TABLE AS`が生成するテーブルには、常にOIDが含まれていました。 PostgreSQL 8.0では、ユーザが明示的に`CREATE TABLE AS`コマンドの結果にOIDを含めるかどうかを指定できるようになりました。 OIDの有無を明示していない場合、default_with_oids設定変数が使用されます。 PostgreSQL 8.1ではdefault_with_oidsのデフォルトは偽ですので、デフォルトの振舞いは8.0以前のリリースとは異なります。 `CREATE TABLE AS`が生成するテーブルにおいてOIDが必要なアプリケーションでは、確実に適切な動作をさせるために明示的に`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`句は拡張です。

## 関連項目

CREATE TABLE, EXECUTE, SELECT, SELECT INTO, VALUES

前のページ | ホーム | 次のページ
CREATE TABLE | 上に戻る | CREATE TABLESPACE