CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } ] TABLE table_name [ (column_name [, ...] ) ] [ [ WITH | WITHOUT ] OIDS ] CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } ] TABLE table_name AS query
CREATE TABLE ASはテーブルを作成し、SELECT コマンド、または、あらかじめ用意されたSELECTコマンドを実行するEXECUTEコマンドによって算出されたデータをそのテーブルに格納します。 テーブルの列は、SELECTの出力列に結び付いた名前とデータ型を持ちます(ただし、新しい列名を明示したリストを渡すと、この列名を上書きすることができます)。
CREATE TABLE ASはビューの作成と似ていますが、実際にはまったく異なります。 CREATE TABLE ASは新しいテーブルを作成し、新しいテーブルの内容を初期化するために一度だけ問い合わせを評価します。 それ以降に行われた、問い合わせの元テーブルに対する変更は、新しいテーブルには反映されません。 反対に、ビューは問い合わせの度に定義されたSELECT文を再評価します。
互換性を保持するため、無視されます。 詳細はCREATE TABLEを参照してください。
指定された場合、テーブルは一時テーブルとして作成されます。 詳細はCREATE TABLEを参照してください。
作成するテーブルの名前です(スキーマ修飾名も可)。
新しいテーブルにおける列の名前です。 列名を指定しない場合は、問い合わせの出力列名を利用します。 EXECUTEコマンドを実行してテーブルを作成する場合は、列名のリストを指定できません。
CREATE TABLE ASで作成されるテーブルがOIDを持つかどうかを指定します。この句は省略可能です。 いずれも指定しなかった場合はdefault_with_oids設定パラメータの値が使用されます。
問い合わせ文(SELECTコマンド、もしくはあらかじめ用意されたSELECTコマンドを実行するEXECUTEコマンド)。 使用できる構文については、それぞれ、SELECT、EXECUTEを参照してください。
このコマンドは、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';
以下の違いを除き、CREATE TABLE ASは標準SQLに従います。
標準では副問い合わせ句を括弧で囲む必要がありますが、PostgreSQLではこの括弧は省略可能です。
標準ではON COMMIT句が定義されていますが、現在のPostgreSQLでは実装されていません。
標準ではWITH [ NO ] DATA句を定義していますが、現在のPostgreSQLでは実装されていません。 PostgreSQLの動作は標準におけるWITH DATAの場合と同じです。
WITH/WITHOUT OIDSはPostgreSQLの拡張です。
PostgreSQLの一時テーブルの扱いは標準とは異なります。 詳細はCREATE TABLEを参照してください。