他のバージョンの文書 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 FOREIGN TABLE

CREATE FOREIGN TABLE — 新しい外部テーブルを定義する

概要

CREATE FOREIGN TABLE [ IF NOT EXISTS ] table_name ( [
  { column_name data_type [ OPTIONS ( option 'value' [, ... ] ) ] [ COLLATE collation ] [ column_constraint [ ... ] ]
    | table_constraint }
    [, ... ]
] )
[ INHERITS ( parent_table [, ... ] ) ]
  SERVER server_name
[ OPTIONS ( option 'value' [, ... ] ) ]

CREATE FOREIGN TABLE [ IF NOT EXISTS ] table_name
  PARTITION OF parent_table [ (
  { column_name [ WITH OPTIONS ] [ column_constraint [ ... ] ]
    | table_constraint }
    [, ... ]
) ]
{ FOR VALUES partition_bound_spec | DEFAULT }
  SERVER server_name
[ OPTIONS ( option 'value' [, ... ] ) ]


ここでcolumn_constraintは以下の通りです。

[ CONSTRAINT constraint_name ]
{ NOT NULL |
  NULL |
  CHECK ( expression ) [ NO INHERIT ] |
  DEFAULT default_expr |
  GENERATED ALWAYS AS ( generation_expr ) STORED }


またtable_constraintは以下の通りです。

[ CONSTRAINT constraint_name ]
CHECK ( expression ) [ NO INHERIT ]


またpartition_bound_specは以下の通りです。

IN ( partition_bound_expr [, ...] ) |
FROM ( { partition_bound_expr | MINVALUE | MAXVALUE } [, ...] )
  TO ( { partition_bound_expr | MINVALUE | MAXVALUE } [, ...] ) |
WITH ( MODULUS numeric_literal, REMAINDER numeric_literal )

説明

CREATE FOREIGN TABLEは現在のデータベース内に新しい外部テーブルを作成します。 このテーブルはコマンドを発行したユーザにより所有されます。

スキーマ名が指定された場合(例えばCREATE FOREIGN TABLE myschema.mytable ...)、テーブルは指定されたスキーマ内に作成されます。 そうでなければ現在のスキーマ内に作成されます。 外部テーブルの名前は同じスキーマ内にある他のリレーション(テーブル、シーケンス、インデックス、ビュー、マテリアライズドビュー、外部テーブル)と異なるものでなければなりません。

CREATE FOREIGN TABLEはまた自動的に外部テーブルの1行に対応する複合型を表すデータ型を作成します。 したがって外部テーブルは同じスキーマ内の既存のデータ型の名前と同じものを持つことができません。

PARTITION OF句が指定された場合、テーブルはparent_tableの指定された境界のパーティションとして作られます。

外部テーブルを作成するためには、外部サーバに対するUSAGE権限とテーブルで使用される列の型すべてに対するUSAGE権限を持たなければなりません。

パラメータ

IF NOT EXISTS

同じ名前のリレーションがすでに存在していてもエラーとしません。 この場合注意が発せられます。 既存のリレーションが作成しようとしたものと何かしら似たものであることは保証されません。

table_name

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

column_name

新しいテーブルで作成される列の名前です。

data_type

列のデータ型です。 これには、配列指定子を含めることができます。 PostgreSQLでサポートされるデータ型の情報に関する詳細は第8章を参照してください。

COLLATE collation

COLLATE句は列(照合可能なデータ型でなければなりません)の照合順序を指定します。 指定されなければ、列のデータ型のデフォルトの照合順序が使用されます。

INHERITS ( parent_table [, ... ] )

オプションでINHERITS句を使い、新しい外部テーブルが自動的にすべての列を継承するテーブルのリストを指定できます。 親テーブルには通常のテーブルまたは外部テーブルが指定できます。 詳しくはCREATE TABLEの類似の構文を参照してください。

PARTITION OF parent_table { FOR VALUES partition_bound_spec | DEFAULT }

この形式は、与えられた親テーブルのパーティションとして指定されたパーティション境界値を持つ外部テーブルを作成するために使うことができます。 より詳細についてはCREATE TABLEの類似の形式を参照してください。 現在のところに親テーブルにUNIQUEインデックスがある場合、親テーブルのパーティションとして外部テーブルを作成することは認められていないことに注意してください。 (ALTER TABLE ATTACH PARTITIONも参照してください。)

CONSTRAINT constraint_name

列制約またはテーブル制約の名前(省略可)です。 制約に違反した時、エラーメッセージ内に制約名が表示されるので、col must be positiveのような制約名を使って、クライアントアプリケーションに役立つ制約情報を通知することができます。 (空白文字を含む制約名を指定するには二重引用符を使う必要があります。) 制約名が指定されなければ、システムが名前を生成します。

NOT NULL

その列がNULL値を持てないことを指定します。

NULL

その列がNULL値を持てることを指定します。 これがデフォルトです。

この句は非標準的なSQLデータベースとの互換性のためだけに提供されています。 新しいアプリケーションでこれを使用するのはお勧めしません。

CHECK ( expression ) [ NO INHERIT ]

CHECK句では、外部テーブルの各行が満たすと期待される論理値の結果を生成する式を指定します。 つまり、式は外部テーブルのすべての行に対して、TRUEまたはUNKNOWNを生成し、決してFALSEにはなりません。 列制約として指定したチェック制約はその列の値だけを参照しますが、テーブル制約として使われる式は複数の列を参照することができます。

現在のところ、CHECKの式は副問い合わせを含むことや、現在の行の列以外の変数を参照することはできません。 システム列tableoidを参照することはできますが、それ以外のシステム列を参照することはできません。

NO INHERITと印を付けられた制約は、子テーブルに継承されません。

DEFAULT default_expr

DEFAULT句は、 列定義の中に現れる、列に対するデフォルトデータ値を割り当てます。 値は変数がない任意の式(副問い合わせおよび、現在のテーブル内の他の列へのクロス参照は許されません)です。 デフォルト式のデータ型は列のデータ型とマッチしなければなりません。

デフォルト式は、列に対する値指定がないすべての挿入操作で使用されます。 列に対するデフォルトがない場合、デフォルトはNULLです。

GENERATED ALWAYS AS ( generation_expr ) STORED

この句は、列を生成列として作成します。 その列に書き込むことはできず、読み出された場合に指定された式の結果が返されます。

キーワードSTOREDは、列が書き込み時に計算されることを指定するのに必要です。 (計算された値は保存用に外部データラッパーへと送られ、読み込み時には返されなければなりません。)

生成式はテーブル内の他の列を参照できますが、他の生成列は参照できません。 使われている関数や演算子はimmutableでなければなりません。 他のテーブルへの参照はできません。

server_name

外部テーブル用に使用される既存の外部サーバの名前です。 外部サーバの詳細についてはCREATE SERVERを参照してください。

OPTIONS ( option 'value' [, ...] )

新しい外部テーブルまたはその列の1つに関連するオプションです。 設定可能なオプションの名前と値は外部データラッパーそれぞれに固有なものであり、外部データラッパーの検証関数を用いて検証されます。 重複するオプション名は許されません(しかしテーブルオプションと列オプションでは同じ名前を持たせることはできます)。

注釈

外部テーブル上の制約(CHECK句やNOT NULL句など)はPostgreSQLのコアシステムによって強制されませんし、ほとんどの外部データラッパーもそれを強制しようとはしません。 つまり、制約は単にそれが成り立つと仮定されるものです。 制約は外部テーブルの機能を使って行を挿入あるいは更新するときにのみ適用され、リモートサーバ上で直接更新するなど、他の手段による行の更新には適用されませんから、それを強制することにはあまり意味はありません。 その代わりに、外部テーブルに指定する制約は、リモートサーバによって強制される制約を表現するものであるべきです。

一部の特別な目的の外部データラッパーは、それがアクセス対象のデータにアクセスするための唯一の機構であり、またその場合、外部データラッパーそれ自体にとって、制約の強制を実行することが適切なことがあります。 ただし、ラッパーのドキュメントにそのように書いてあるのでなければ、それを仮定しない方が良いでしょう。

PostgreSQLでは外部テーブルの制約を強制しませんが、問い合わせの最適化という目的のため、制約が正しいということを仮定します。 外部テーブルで、宣言された制約を満たさない行が可視の状態で存在する場合、そのテーブルに対する問い合わせはエラーになったり誤った結果をもたらしたりするかもしれません。 制約の定義が現実に即したものであることを保証するのは、ユーザの責任です。

注意

外部テーブルがパーティション化テーブルのパーティションとして使われていれば、その内容はパーティショニングの規則を満たさねばならないという暗黙の制約があります。 ここでもまた、それが真であることを保証するのは、ユーザの責任です。これにはリモートサーバに一致する制約を設定するのが最善です。

外部テーブルパーティションを含むパーティション化テーブル内では、パーティションキー値を変更するUPDATEは、外部データラッパーがタプルルーティングをサポートしていれば、行をローカルパーティションから外部テーブルパーティションへと移動する原因となる可能性があります。 しかしながら、行を外部テーブルパーティションから別のパーティションに移動することは現在のところできません。 そのようなことを要求するUPDATEは、リモートサーバにより適切に強制されるのであれば、パーティショニングの制約のために失敗するでしょう。

似たような配慮は生成列に適用されます。 保存生成列は、ローカルのPostgreSQLサーバ上で挿入されたり更新されたりした時に計算され、外部データ保存領域へ書き出すために外部データラッパーへと渡されますが、外部テーブルへの問い合わせが生成式と矛盾しない保存生成列の値を返すことは強制されていません。 ここでも、問い合わせの結果が正しくないということになる可能性があります。

サーバfilm_serverを通してアクセスされる、外部テーブルfilmsを作成します。

CREATE FOREIGN TABLE films (
    code        char(5) NOT NULL,
    title       varchar(40) NOT NULL,
    did         integer NOT NULL,
    date_prod   date,
    kind        varchar(10),
    len         interval hour to minute
)
SERVER film_server;

範囲パーティションテーブルmeasurementのパーティションとして、サーバserver_07を通してアクセスされる外部テーブルmeasurement_y2016m07を作成します。

CREATE FOREIGN TABLE measurement_y2016m07
    PARTITION OF measurement FOR VALUES FROM ('2016-07-01') TO ('2016-08-01')
    SERVER server_07;

互換性

CREATE FOREIGN TABLEはおおよそ標準SQLに準拠します。 しかしCREATE TABLEとほとんど同様、NULL制約とゼロ列の外部テーブルが許されます。 列のデフォルト値を指定する機能もPostgreSQLの拡張です。 PostgreSQLが定義する形式のテーブルの継承は標準とは異なります。

関連項目

ALTER FOREIGN TABLE, DROP FOREIGN TABLE, CREATE TABLE, CREATE SERVER, IMPORT FOREIGN SCHEMA