★PostgreSQLカンファレンス2024 12月6日開催/チケット販売中★
他のバージョンの文書 16 | 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 } ] TABLE table_name
    [ (column_name [, ...] ) ]
    [ WITH ( storage_parameter [= value] [, ... ] ) | WITH OIDS | WITHOUT OIDS ]
    [ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ]
    [ TABLESPACE tablespace ]
    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

SELECTTABLEVALUESコマンドまたは、あらかじめ準備されたSELECTTABLEまたは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に従います。 以下は非標準の拡張です。

関連項目

CREATE TABLE, EXECUTE, SELECT, SELECT INTO, VALUES