CREATE FOREIGN TABLE — 新しい外部テーブルを定義する
CREATE FOREIGN TABLE [ IF NOT EXISTS ]table_name
( [ {column_name
data_type
[ OPTIONS (option
'value
' [, ... ] ) ] [ COLLATEcollation
] [column_constraint
[ ... ] ] |table_constraint
} [, ... ] ] ) [ INHERITS (parent_table
[, ... ] ) ] SERVERserver_name
[ OPTIONS (option
'value
' [, ... ] ) ] CREATE FOREIGN TABLE [ IF NOT EXISTS ]table_name
PARTITION OFparent_table
[ ( {column_name
[ WITH OPTIONS ] [column_constraint
[ ... ] ] |table_constraint
} [, ... ] ) ] { FOR VALUESpartition_bound_spec
| DEFAULT } SERVERserver_name
[ OPTIONS (option
'value
' [, ... ] ) ] ここでcolumn_constraint
は以下の通りです。 [ CONSTRAINTconstraint_name
] { NOT NULL | NULL | CHECK (expression
) [ NO INHERIT ] | DEFAULTdefault_expr
| GENERATED ALWAYS AS (generation_expr
) STORED } またtable_constraint
は以下の通りです。 [ CONSTRAINTconstraint_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 ( MODULUSnumeric_literal
, REMAINDERnumeric_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が定義する形式のテーブルの継承は標準とは異なります。