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' [, ... ] ) ] ここでcolumn_constraintは以下の通りです。 [ CONSTRAINT constraint_name ] { NOT NULL | NULL | CHECK ( expression ) [ NO INHERIT ] | DEFAULT default_expr } またtable_constraintは以下の通りです。 [ CONSTRAINT constraint_name ] CHECK ( expression ) [ NO INHERIT ]
CREATE FOREIGN TABLEは現在のデータベース内に新しい外部テーブルを作成します。 このテーブルはコマンドを発行したユーザにより所有されます。
スキーマ名が指定された場合(例えばCREATE FOREIGN TABLE myschema.mytable ...)、テーブルは指定されたスキーマ内に作成されます。 そうでなければ現在のスキーマ内に作成されます。 外部テーブルの名前は同じスキーマ内にある他の外部テーブル、テーブル、シーケンス、インデックス、ビュー、マテリアライズドビューと異なるものでなければなりません。
CREATE FOREIGN TABLEはまた自動的に外部テーブルの1行に対応する複合型を表すデータ型を作成します。 したがって外部テーブルは同じスキーマ内の既存のデータ型の名前と同じものを持つことができません。
外部テーブルを作成するためには、外部サーバに対するUSAGE権限とテーブルで使用される列の型すべてに対するUSAGE権限を持たなければなりません。
同じ名前のリレーションがすでに存在していてもエラーとしません。 この場合注意が発せられます。 既存のリレーションが作成しようとしたものと何かしら似たものであることは保証されません。
作成するテーブルの名前です(スキーマ修飾名でも可)。
新しいテーブルで作成される列の名前です。
列のデータ型です。 これには、配列指定子を含めることができます。 PostgreSQLでサポートされるデータ型の情報に関する詳細は第8章を参照してください。
COLLATE句は列(照合可能なデータ型でなければなりません)の照合順序を指定します。 指定されなければ、列のデータ型のデフォルトの照合順序が使用されます。
オプションでINHERITS句を使い、新しい外部テーブルが自動的にすべての列を継承するテーブルのリストを指定できます。 親テーブルには通常のテーブルまたは外部テーブルが指定できます。 詳しくはCREATE TABLEの類似の構文を参照してください。
列制約またはテーブル制約の名前(省略可)です。 制約に違反した時、エラーメッセージ内に制約名が表示されるので、col must be positiveのような制約名を使って、クライアントアプリケーションに役立つ制約情報を通知することができます。 (空白文字を含む制約名を指定するには二重引用符を使う必要があります。) 制約名が指定されなければ、システムが名前を生成します。
その列がNULL値を持てないことを指定します。
その列がNULL値を持てることを指定します。 これがデフォルトです。
この句は非標準的なSQLデータベースとの互換性のためだけに提供されています。 新しいアプリケーションでこれを使用するのはお勧めしません。
CHECK句では、外部テーブルの各行が満たすと期待されるブーリアン結果を生成する式を指定します。 つまり、式は外部テーブルのすべての行に対して、TRUEまたはUNKNOWNを生成し、決してFALSEにはなりません。 列制約として指定したチェック制約はその列の値だけを参照しますが、テーブル制約として使われる式は複数の列を参照することができます。
現在のところ、CHECKの式は副問い合わせを含むことや、現在の行の列以外の変数を参照することはできません。 システム列tableoidを参照することはできますが、それ以外のシステム列を参照することはできません。
NO INHERITと印を付けられた制約は、子テーブルに継承されません。
DEFAULT句は、 列定義の中に現れる、列に対するデフォルトデータ値を割り当てます。 値は変数がない任意の式(副問い合わせおよび、現在のテーブル内の他の列へのクロス参照は許されません)です。 デフォルト式のデータ型は列のデータ型とマッチしなければなりません。
デフォルト式は、列に対する値指定がないすべての挿入操作で使用されます。 列に対するデフォルトがない場合、デフォルトはNULLです。
外部テーブル用に使用される既存の外部サーバの名前です。 外部サーバの詳細についてはCREATE SERVERを参照してください。
新しい外部テーブルまたはその列の1つに関連するオプションです。 設定可能なオプションの名前と値は外部データラッパそれぞれに固有なものであり、外部データラッパの検証関数を用いて検証されます。 重複するオプション名は許されません(しかしテーブルオプションと列オプションでは同じ名前を持たせることはできます)。
外部テーブル上の制約(CHECK句やNOT NULL句など)はPostgreSQLのコアシステムによって強制されませんし、ほとんどの外部データラッパもそれを強制しようとはしません。 つまり、制約は単にそれが成り立つと仮定されるものです。 制約は外部テーブルの機能を使って行を挿入あるいは更新するときにのみ適用され、リモートサーバ上で直接更新するなど、他の手段による行の更新には適用されませんから、それを強制することにはあまり意味はありません。 その代わりに、外部テーブルに指定する制約は、リモートサーバによって強制される制約を表現するものであるべきです。
一部の特別な目的の外部データラッパは、それがアクセス対象のデータにアクセスするための唯一の機構であり、またその場合、外部データラッパそれ自体にとって、制約の強制を実行することが適切なことがあります。 ただし、ラッパのドキュメントにそのように書いてあるのでなければ、それを仮定しない方が良いでしょう。
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;
CREATE FOREIGN TABLEはおおよそ標準SQLに準拠します。 しかしCREATE TABLEとほとんど同様、NULL制約とゼロ列の外部テーブルが許されます。 列のデフォルト値を指定する機能もPostgreSQLの拡張です。 PostgreSQLが定義する形式のテーブルの継承は標準とは異なります。