.\\" auto-generated by docbook2man-spec $Revision: 1.2 $
.TH "CREATE TABLE AS" "" "2007-05-04" "SQL - 言語" "SQLコマンド"
.SH NAME
CREATE TABLE AS \- 問い合わせの結果によって新しいテーブルを定義する

.SH SYNOPSIS
.sp
.nf
CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } ] TABLE \fItable_name\fR
    [ (\fIcolumn_name\fR [, ...] ) ]
    [ WITH ( \fIstorage_parameter\fR [= \fIvalue\fR] [, ... ] ) | WITH OIDS | WITHOUT OIDS ]
    [ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ]
    [ TABLESPACE \fItablespace\fR ]
CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } ] TABLE \fItable_name\fR
    AS \fIquery\fR
.sp
.fi
.SH "説明"
.PP
\fBCREATE TABLE AS\fRはテーブルを作成し、\fBSELECT\fR コマンドによって算出されたデータをそのテーブルに格納します。
テーブルの列は、\fBSELECT\fRの出力列に結び付いた名前とデータ型を持ちます（ただし、新しい列名を明示したリストを渡すと、この列名を上書きすることができます）。
.PP
\fBCREATE TABLE AS\fRはビューの作成と似ていますが、実際にはまったく異なります。
\fBCREATE TABLE AS\fRは新しいテーブルを作成し、新しいテーブルの内容を初期化するために一度だけ問い合わせを評価します。
それ以降に行われた、問い合わせの元テーブルに対する変更は、新しいテーブルには反映されません。
反対に、ビューは問い合わせの度に定義された\fBSELECT\fR文を再評価します。
.SH "パラメータ"
.TP
\fBGLOBAL or LOCAL\fR
互換性を保持するため、無視されます。
詳細はCREATE TABLE [\fBcreate_table\fR(l)]を参照してください。
.PP
.TP
\fBTEMPORARY or TEMP\fR
指定された場合、テーブルは一時テーブルとして作成されます。
詳細はCREATE TABLE [\fBcreate_table\fR(l)]を参照してください。
.TP
\fB\fItable_name\fB\fR
作成するテーブルの名前です（スキーマ修飾名も可）。
.TP
\fB\fIcolumn_name\fB\fR
新しいテーブルにおける列の名前です。
列名を指定しない場合は、問い合わせの出力列名を利用します。
\fBEXECUTE\fRコマンドを実行してテーブルを作成する場合は、列名のリストを指定できません。
.TP
\fBWITH ( \fIstorage_parameter\fB [= \fIvalue\fB] [, ... ] )\fR
この句は、新しいテーブル用の省略可能な格納パラメータを指定します。
詳細は格納パラメータ [\fBcreate_table\fR(l)]を参照してください。
WITHには、OIDS=TRUE（もしくは単なるOIDS）を含めて、新しいテーブルの行が行に割り当てられたOID（オブジェクト識別子）を持たなければならないことを指定することもできます。
また、OIDS=FALSEを含めて、OIDを持たないことを指定することもできます。
詳細はCREATE TABLE [\fBcreate_table\fR(l)]を参照してください。
.TP
\fBWITH OIDS\fR
.TP
\fBWITHOUT OIDS\fR
これらは古い構文で、それぞれWITH (OIDS)とWITH (OIDS=FALSE)と同じです。
OIDSと格納パラメータの設定の両方を指定したい場合、上記のWITH ( ... )構文を使用しなければなりません。
.TP
\fBON COMMIT\fR
トランザクションブロックの終了時の一時テーブルの動作をON COMMITを使用して制御することができます。
以下の3つのオプションがあります。
.RS
.TP
\fBPRESERVE ROWS\fR
トランザクションの終了時に特別な処理は何も行われません。
これがデフォルトの動作です。
.TP
\fBDELETE ROWS\fR
各トランザクションブロックの終了時に、一時テーブルのすべての行が削除されます。
具体的には、コミット毎に自動的にTRUNCATE [\fBtruncate\fR(l)]が行われます。
.TP
\fBDROP\fR
現在のトランザクションブロックの終了時に一時テーブルは削除されます。
.RE
.PP
.TP
\fBTABLESPACE \fItablespace\fB\fR
\fItablespace\fRは、新しいテーブルの作成先となるテーブル空間名です。
指定がなければ、default_tablespaceが使用されます。
また、もしdefault_tablespaceが空文字列の場合はデータベースのデフォルトのテーブル空間が使用されます。
.TP
\fB\fIquery\fB\fR
SELECT [\fBselect\fR(l)]、または、あらかじめ準備された\fBSELECT\fRまたは\fBVALUES\fR問い合わせを実行するVALUES [\fBvalues\fR(l)]です。
.SH "注釈"
.PP
このコマンドは、SELECT INTO [\fBselect_into\fR(l)]と同じ機能を持ちますが、\fBSELECT INTO\fR構文の他の使用方法と混乱する可能性が少ないため、こちらを使用する方が良いでしょう。
さらに、\fBCREATE TABLE AS\fRは、\fBSELECT INTO\fRが提供する機能のスーパーセットを提供します。
.PP
PostgreSQL 8.0より前は、\fBCREATE TABLE AS\fRが生成するテーブルには、常にOIDが含まれていました。
PostgreSQL 8.0では、ユーザが明示的に\fBCREATE TABLE AS\fRコマンドの結果にOIDを含めるかどうかを指定できるようになりました。
OIDの有無を明示していない場合、default_with_oids設定変数が使用されます。
PostgreSQL 8.1ではdefault_with_oidsのデフォルトは偽ですので、デフォルトの振舞いは8.0以前のリリースとは異なります。
\fBCREATE TABLE AS\fRが生成するテーブルにおいてOIDが必要なアプリケーションでは、確実に適切な動作をさせるために明示的にWITH (OIDS)を付与しなければなりません。
.SH "例"
.PP
filmsの最近の項目のみから構成される、新しいfilms_recentテーブルを作成します。
.sp
.nf
CREATE TABLE films_recent AS
  SELECT * FROM films WHERE date_prod >= '2002-01-01';
.sp
.fi
.PP
準備された文を使用して、films内の最近の項目のみから構成されるfilms_recent一時テーブルを作成します。
この新しいテーブルはOIDを持ち、コミット時に削除されます。
.sp
.nf
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');
.sp
.fi
.SH "互換性"
.PP
以下の違いを除き、\fBCREATE TABLE AS\fRは標準SQLに従います。
.TP 0.2i
\(bu
標準では副問い合わせ句を括弧で囲む必要がありますが、PostgreSQLではこの括弧は省略可能です。
.TP 0.2i
\(bu
標準ではWITH [ NO ] DATA句を定義していますが、現在のPostgreSQLでは実装されていません。
PostgreSQLの動作は標準におけるWITH DATAの場合と同じです。
WITH NO DATAは、問い合わせにLIMIT 0を追加することで模擬することができます。
.TP 0.2i
\(bu
PostgreSQLの一時テーブルの扱いは標準とは異なります。
詳細はCREATE TABLE [\fBcreate_table\fR(l)]を参照してください。
.TP 0.2i
\(bu
WITH句はPostgreSQLの拡張です。
格納パラメータもOIDも標準にはありません。
.TP 0.2i
\(bu
PostgreSQLのテーブル空間という概念は標準にはありません。
したがって、TABLESPACE句は拡張です。
.PP
.SH "関連項目"
CREATE TABLE [\fBcreate_table\fR(l)], EXECUTE [\fBexecute\fR(l)], SELECT [\fBselect\fR(l)], SELECT INTO [\fBselect_into\fR(l)], VALUES [\fBvalues\fR(l)]
