CREATE TABLE — 新しいテーブルを定義する
CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXISTS ] table_name ( [
{ column_name data_type [ STORAGE { PLAIN | EXTERNAL | EXTENDED | MAIN | DEFAULT } ] [ COMPRESSION compression_method ] [ COLLATE collation ] [ column_constraint [ ... ] ]
| table_constraint
| LIKE source_table [ like_option ... ] }
[, ... ]
] )
[ INHERITS ( parent_table [, ... ] ) ]
[ PARTITION BY { RANGE | LIST | HASH } ( { column_name | ( expression ) } [ COLLATE collation ] [ opclass ] [, ... ] ) ]
[ USING method ]
[ WITH ( storage_parameter [= value] [, ... ] ) | WITHOUT OIDS ]
[ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ]
[ TABLESPACE tablespace_name ]
CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXISTS ] table_name
OF type_name [ (
{ column_name [ WITH OPTIONS ] [ column_constraint [ ... ] ]
| table_constraint }
[, ... ]
) ]
[ PARTITION BY { RANGE | LIST | HASH } ( { column_name | ( expression ) } [ COLLATE collation ] [ opclass ] [, ... ] ) ]
[ USING method ]
[ WITH ( storage_parameter [= value] [, ... ] ) | WITHOUT OIDS ]
[ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ]
[ TABLESPACE tablespace_name ]
CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXISTS ] table_name
PARTITION OF parent_table [ (
{ column_name [ WITH OPTIONS ] [ column_constraint [ ... ] ]
| table_constraint }
[, ... ]
) ] { FOR VALUES partition_bound_spec | DEFAULT }
[ PARTITION BY { RANGE | LIST | HASH } ( { column_name | ( expression ) } [ COLLATE collation ] [ opclass ] [, ... ] ) ]
[ USING method ]
[ WITH ( storage_parameter [= value] [, ... ] ) | WITHOUT OIDS ]
[ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ]
[ TABLESPACE tablespace_name ]
ここでcolumn_constraintには、次の構文が入ります。
[ CONSTRAINT constraint_name ]
{ NOT NULL |
NULL |
CHECK ( expression ) [ NO INHERIT ] |
DEFAULT default_expr |
GENERATED ALWAYS AS ( generation_expr ) STORED |
GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY [ ( sequence_options ) ] |
UNIQUE [ NULLS [ NOT ] DISTINCT ] index_parameters |
PRIMARY KEY index_parameters |
REFERENCES reftable [ ( refcolumn ) ] [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ]
[ ON DELETE referential_action ] [ ON UPDATE referential_action ] }
[ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]
また、table_constraintには、次の構文が入ります。
[ CONSTRAINT constraint_name ]
{ CHECK ( expression ) [ NO INHERIT ] |
UNIQUE [ NULLS [ NOT ] DISTINCT ] ( column_name [, ... ] ) index_parameters |
PRIMARY KEY ( column_name [, ... ] ) index_parameters |
EXCLUDE [ USING index_method ] ( exclude_element WITH operator [, ... ] ) index_parameters [ WHERE ( predicate ) ] |
FOREIGN KEY ( column_name [, ... ] ) REFERENCES reftable [ ( refcolumn [, ... ] ) ]
[ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ] [ ON DELETE referential_action ] [ ON UPDATE referential_action ] }
[ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]
またlike_optionは、以下の通りです。
{ INCLUDING | EXCLUDING } { COMMENTS | COMPRESSION | CONSTRAINTS | DEFAULTS | GENERATED | IDENTITY | INDEXES | STATISTICS | STORAGE | ALL }
また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 )
UNIQUE、PRIMARY KEYおよびEXCLUDE制約内のindex_parametersは以下の通りです。
[ INCLUDE ( column_name [, ... ] ) ]
[ WITH ( storage_parameter [= value] [, ... ] ) ]
[ USING INDEX TABLESPACE tablespace_name ]
EXCLUDE制約内のexclude_elementは以下の通りです。
{ column_name | ( expression ) } [ COLLATE collation ] [ opclass [ ( opclass_parameter = value [, ... ] ) ] ] [ ASC | DESC ] [ NULLS { FIRST | LAST } ]
FOREIGN KEY/REFERENCES制約内のreferential_actionは以下の通りです。
{ NO ACTION | RESTRICT | CASCADE | SET NULL [ ( column_name [, ... ] ) ] | SET DEFAULT [ ( column_name [, ... ] ) ] }
CREATE TABLEは、現在のデータベースに新しい空のテーブルを作成します。
作成したテーブルはこのコマンドを実行したユーザが所有します。
スキーマ名が付けられている場合(例えば、CREATE TABLE myschema.mytable ...)、テーブルは指定されたスキーマに作成されます。
スキーマ名がなければ、テーブルは現在のスキーマに作成されます。
また、一時テーブルは特別なスキーマに存在するため、一時テーブルの作成時にスキーマ名を与えることはできません。
テーブル名は、同じスキーマ内の他のリレーション(テーブル、シーケンス、インデックス、ビュー、マテリアライズドビュー、外部テーブル)とは異なる名前にする必要があります。
さらに、CREATE TABLEは、作成するテーブルの1行に対応する複合型のデータ型を作成します。
したがって、テーブルは、同じスキーマ内の既存のデータ型と同じ名前を持つことができません。
制約句には、挿入、更新操作を行うときに、新しい行、または更新する行が満たさなければならない制約(検査項目)を指定します。制約句は省略可能です。 制約は、テーブル内で有効な値の集合を様々な方法で定義できるSQLオブジェクトです。
制約の定義にはテーブル制約と列制約という2種類があります。 列制約は列定義の一部として定義されます。 テーブル制約定義は、特定の列とは結びつけられておらず、複数の列を含有することができます。 また、全ての列制約はテーブル制約として記述することができます。 列制約は、1つの列にのみ影響する制約のための、簡便な記述方法に過ぎません。
テーブルを作成するためには、すべての列の型またはOF句中の型に対するUSAGE権限を持たなければなりません。
TEMPORARYまたはTEMP #
このパラメータが指定された場合、テーブルは一時テーブルとして作成されます。
一時テーブルは、そのセッションの終わり、場合によっては、現在のトランザクションの終わり(後述のON COMMITを参照)に自動的に削除されます。
デフォルトのsearch_pathは一時スキーマを最初に含んでいますので、同じ名前を持つ既存の永続テーブルは、スキーマ修飾名で参照されていない限り、一時テーブルが存在する間は非可視になります。
一時テーブルに作られるインデックスも、全て自動的に一時的なものとなります。
自動バキュームデーモンは一時テーブルにアクセスできないため、一時テーブルのバキュームや解析を行うことはできません。
このためセッションのSQLコマンドを用いて適切なバキュームと解析を実行しなければなりません。
例えば、一時テーブルが複雑な問い合わせで使用される場合、一時テーブルにデータを投入した後にそれに対しANALYZEを実行することを勧めます。
オプションで、GLOBALまたはLOCALをTEMPORARYやTEMPの前に記述することができます。
PostgreSQLでは、現在違いがなく、廃止予定です。
互換性を参照してください。
UNLOGGED #指定された場合、テーブルはログを取らないテーブルとして作成されます。 ログを取らないテーブルに書き出されたデータは先行書き込みログ(第30章参照)には書き出されません。 このため通常のテーブルより相当高速になります。 しかしこれらはクラッシュ時に安全ではありません。 クラッシュまたは異常停止の後、ログを取らないテーブルは自動的に切り詰められます。 またログを取らないテーブルの内容はスタンバイサーバにコピーされません。 ログを取らないテーブル上に作成されたインデックスはすべて同様に、ログを取らないようになります。
これを指定すると、(ID列またはシリアル列用の)ログを取らないテーブルと一緒に作成されたシーケンスも、ログを取らないものとして作成されます。
IF NOT EXISTS #同じ名前のリレーションがすでに存在していてもエラーとしません。 この場合注意が発せられます。 既存のリレーションが作成しようとしたものと何かしら似たものであることは保証されません。
table_name #作成するテーブルの名前です(スキーマ修飾名でも可)。
OF type_name #
指定した複合型(スキーマ修飾可能)から構造を取り出した型付きテーブルを作成します。
型付きテーブルはその型に束縛されます。
例えば、型が(DROP TYPE ... CASCADEで)削除されるとそのテーブルは削除されます。
型付きテーブルが作成されると、その列のデータ型は背後の複合型により決定され、CREATE TABLEコマンドでは指定されません。
しかしCREATE TABLEコマンドではテーブルにデフォルトと制約を追加できます。
また、格納パラメータの指定も可能です。
column_name #新しいテーブルで作成される列の名前です。
data_type #列のデータ型です。 これには、配列指定子を含めることができます。 PostgreSQLでサポートされるデータ型の情報に関する詳細は第8章を参照してください。
COLLATE collation #
COLLATE句は列(照合順の設定が可能なデータ型でなければなりません)に照合順を割り当てます。
指定がなければ、列のデータ型のデフォルトの照合順が使用されます。
STORAGE { PLAIN | EXTERNAL | EXTENDED | MAIN | DEFAULT }
#
この構文は、列の格納モードを設定します。
これは、この列をインラインに保持するか、二次的なTOASTテーブルに保持するか、およびデータを圧縮する必要があるかどうかを制御します。
PLAINは、integerなどの固定長の値に使用することが必要で、インラインで、非圧縮です。
MAINはインラインで、圧縮可能なデータに対するものです。
EXTERNALは外部で、非圧縮データであり、EXTENDEDは外部で、圧縮されたデータに使用されます。
DEFAULTと書くと、列のデータ型に対して格納モードをデフォルトのモードに設定します。
EXTENDEDは、PLAIN以外の保管をサポートするほとんどのデータ型におけるデフォルトです。
EXTERNALを使用すると、非常に長いtextおよびbytea列に対する部分文字列操作の処理速度が向上しますが、必要な保管容量が増えるというデメリットがあります。
詳細は、73.2を参照してください。
COMPRESSION compression_method #
COMPRESSION句は列の圧縮方式を設定します。圧縮は可変幅データ型に対してのみサポートされていて、列の格納モードがmainまたはextendedの場合にのみ使われます。
(列の格納モードについての情報はALTER TABLEを参照してください。)
パーティションテーブルには自身のストレージがありませんので、パーティションテーブルに対してこの属性を設定しても直接の影響はありませんが、設定値は新しく作成されるパーティションに継承されます。
サポートされている圧縮方式はpglzとlz4です。
(lz4は、PostgreSQL構築時に--with-lz4が使われた場合にのみ利用可能です。)
さらにcompression_methodは、明示的にデフォルトの動作を指定するためにdefaultとすることもできます。その場合、利用する圧縮方式を決定するためにデータ挿入時にdefault_toast_compression設定を調べます。
INHERITS ( parent_table [, ... ] ) #
オプションのINHERITS句でテーブルの一覧を指定すると、新しいテーブルは指定されたテーブルの全ての列を自動的に継承します。
親テーブルには通常のテーブルまたは外部テーブルを指定できます。
INHERITSを使用すると、新しい子テーブルとその親テーブル(複数可)との間に永続的な関連が作成されます。
通常、親へのスキーマ変更は子にも伝播します。また、デフォルトでは、親テーブルの走査結果には子テーブルのデータが含まれます。
複数の親テーブルに同一名の列が存在する場合、それらのデータ型が一致していなければ、エラーとして報告されます。 競合がなければ、これらの重複した列は新しいテーブルで1つの列の形に融合されます。 新しいテーブルの列名の一覧に継承する列の名前が含まれる場合も、そのデータ型は継承する列のデータ型と一致していなければなりません。さらに、その列定義は1つに融合されます。 新しいテーブルで明示的に列のデフォルト値を指定した場合、継承した列宣言における全てのデフォルト値は上書きされます。 デフォルト値を指定しなかった場合、親側でデフォルト値が指定されている時は、それらのデフォルト値が全て同じ値でなければなりません。 値が違う場合はエラーになります。
CHECK制約は、基本的には列と同様の方法でマージされます。
複数の親テーブル、新しいテーブル、またはその両方の定義に同じ名前のCHECK制約が存在した場合、これらの制約はすべて同じ検査式を持たなければなりません。
さもなくば、エラーが報告されます。
同じ名前と式を持つ制約は1つのコピーにまとめられます。
親テーブルでNO INHERITと印が付いた制約は考慮されません。
新しいテーブル内の無名のCHECK制約は、一意な名前が必ず作られるため、マージされないことに注意してください。
列のSTORAGE設定もまた親テーブルからコピーされます。
親テーブルのある列がIDENTITY列の場合、その属性は継承されません。 望むなら子テーブルの列をIDENTITY列と宣言することができます。
PARTITION BY { RANGE | LIST | HASH } ( { column_name | ( expression ) } [ opclass ] [, ...] ) #
オプションのPARTITION BY句により、テーブルのパーティショニングの戦略を指定できます。
このようにして作られたテーブルをパーティションテーブルと呼びます。
括弧に囲まれた列や式のリストはテーブルのパーティションキーを構成します。
範囲パーティションを使うときは、パーティションキーは複数の列または式にまたがることができます(最大で32ですが、この制限はPostgreSQLをビルドする時に変更できます)が、リストパーティションでは、パーティションキーは1つだけの列または式で構成されなければなりません。
パーティションテーブルの作成時にBツリー演算子クラスを指定しない場合は、そのデータ型のデフォルトのBツリー演算子クラスが使用されます。
Bツリー演算子クラスがない場合はエラーが報告されます。
範囲とリストのパーティショニングはBツリー演算子クラスを必要とし、ハッシュパーティショニングはハッシュ演算子クラスを必要とします。 演算子クラスが明示的に指定されない場合、適当な型のデフォルトの演算子クラスが使われます。デフォルト演算子クラスがなければエラーが発生します。 ハッシュパーティショニングが使われているとき、使われる演算子クラスはサポート関数2を実装していなければなりません(詳しくは38.16.3を参照)。
パーティションテーブルは(パーティションと呼ばれる)副テーブルに分割され、それらは別のCREATE TABLEコマンドにより作成されます。
パーティションテーブルそれ自体は空になります。
テーブルに挿入されるデータ行は、パーティションキーの列あるいは式の値に基づいて、1つのパーティションに回されます。
新しい行の値に適合するパーティションが存在しないときは、エラーが報告されます。
パーティションテーブルはEXCLUDE制約をサポートしません。しかしながら、個々のパーティションにこの制約を定義することはできます。
テーブルパーティショニングに関するより詳しい説明は5.11を参照してください。
PARTITION OF parent_table { FOR VALUES partition_bound_spec | DEFAULT } #
指定した親テーブルのパーティションとしてテーブルを作成します。
FOR VALUESを用いて特定の値のパーティションとして、あるいは、DEFAULTを用いてデフォルトパーティションとしてテーブルを作成できます。
親テーブルにあるインデックス、制約、ユーザ定義の行レベルのトリガは新しいパーティションに複製されます。
partition_bound_specは親テーブルのパーティショニング方法とパーティションキーに対応していなければならず、またそのテーブルのどの既存のパーティションとも重なり合ってはいけません。
INの構文はリストパーティショニングで、FROMとTOの構文は範囲パーティショニングで、WITHの構文はハッシュパーティショニングで、使用されます。
partition_bound_exprは任意の無変数式です(サブクエリ、ウィンドウ関数、集約関数、複数行を返す関数は許されません)。
式のデータ型は対応するパーティションキー列と一致しなければなりません。
式はテーブル作成時に一度だけ評価されるため、などの揮発性の式を含むことも可能です。
CURRENT_TIMESTAMP
リストパーティションを作るときは、NULLを指定することができて、それはそのパーティションではパーティションキーの列をNULLにすることができるということを意味します。
しかし、1つの親テーブルで2つ以上、そのようなリストパーティションを作ることはできません。
範囲パーティションではNULLを指定することはできません。
範囲パーティションを作るとき、FROMで指定する下限はそれを含む境界、TOで指定する上限はそれを含まない境界になります。
つまり、FROMリストで指定される値は、そのパーティションの対応するパーティションキー列において有効な値ですが、TOリストで指定される値はそうではない、ということです。
この文の意味は行単位の比較の規則(9.24.5)に従って理解しなければならないことに注意してください。
例えば、PARTITION BY RANGE (x,y)について、パーティション境界FROM (1, 2) TO (3, 4)には、x=1でy>=2の任意の値のもの、x=2でNULLでない任意のyのもの、x=3でy<4の任意の値のものが入ります。
範囲パーティションを作るとき、MINVALUEおよびMAXVALUEという特別な値を使用することができて、これらはそれぞれ列の値に下限と上限がないことを示します。
例えば、FROM (MINVALUE) TO (10)で定義されたパーティションには10より小さいすべての値が入り、FROM (10) TO (MAXVALUE)で定義されたパーティションには10以上のすべての値が入ります。
2つ以上の列を含む範囲パーティションを作るとき、MAXVALUEを下限の一部として使うことや、MINVALUEを上限の一部として使うことも意味を持ちえます。
例えば、FROM (0, MAXVALUE) TO (10, MAXVALUE)で定義されたパーティションには、パーティションキーの第1列が0より大きく、かつ10以下であるものが入ります。
同様に、FROM ('a', MINVALUE) TO ('b', MINVALUE)で定義されたパーティションには、パーティションキーの第1列が"a"で始まるすべての行が入ります。
MINVALUEまたはMAXVALUEをパーティション境界の1つの列で使用する場合、それより後の列では同じ値を使用しなければならないことに注意してください。
例えば、(10, MINVALUE, 0)は有効な境界ではありません。
(10, MINVALUE, MINVALUE)とします。
timestampなど一部の要素型では、"infinity"(無限)の概念があり、それも保存できる値であることにも注意してください。
MINVALUEとMAXVALUEは保存できる真の値ではなく、値に境界がないということを表現するための方法に過ぎないため、これとは違います。
MAXVALUEは"infinity"も含め、他のすべての値より大きいものと考えることができ、またMINVALUEは"minus infinity"も含め、他のすべての値より小さいものと考えることができます。
従って、境界FROM ('infinity') TO (MAXVALUE)は空の範囲ではなく、たった1つの値、つまり"infinity"だけを保存します。
DEFAULTが指定された場合、テーブルは親テーブルのデフォルトパーティションとして作成されます。
本オプションはハッシュパーティションされたテーブルには使用できません。
親の他のどのパーティションにも当てはまらないパーティションキー値はデフォルトパーティションに送られます。
テーブルが既存のDEFAULTパーティションを持っていて、新たなパーティションが追加された場合、デフォルトパーティションは、新たなパーティションに属すのがふさわしい行が含まれていないことを確かめるために、検査されなければなりません。
デフォルトパーティションに多数の行が含まれている場合、これは時間を要すかもしれません。
デフォルトパーティションが、外部テーブルであるか、新パーティションに置くべき行を含むことができないことを証明する制約を持つ場合、この検査は省略されます。
ハッシュパーティションを作るときには法と残余を指定しなければなりません。 法は正の整数でなければならず、残余は法よりも小さい非負整数でなければなりません。 典型的にはハッシュパーティションテーブル初期設定をするとき、パーティションの数と等しい法を選び、全てのテーブルに同じ法と異なる残余を割り当てます(後述の例を参照)。 しかしながら、全てのパーティションが同じ法を持つ必要はなく、あるハッシュパーティションテーブルのパーティションに存在する全ての法が次に大きい法の因子であることだけ必要です。 このことは、全データを一度に移すことなくパーティション数を徐々に増やすことを可能にします。 例えば、各々の法が8である8パーティションのハッシュパーティションテーブルがあるとして、パーティション数を16に増やさなければならなくなったとします。 私たちは8を法とするパーティションの一つをデタッチして、新たに16を法とするキー空間の同じ部分(一つはデタッチしたパーティションと等しい残余を持ち、一つはその値に8を加えたのと等しい残余を持つ)を対象とする二つのパーティションを追加して、データを再配置することができます。 これを(おそらくはより後に)8を法とする各パーティションがなくなるまで、繰り返すことができます。 これは依然として各ステップで大きなデータ移動を伴いますが、全体の新テーブルを作って全データを一度に移さなければならないというよりは、まだ良いです。
パーティションは、それが属するパーティションテーブルと同じ列名および型を持っていなければなりません。
パーティションテーブルの列名や型の変更は自動的にすべてのパーティションに反映されます。
CHECK制約はすべてのパーティションで自動的に継承されますが、個々のパーティションで追加のCHECK制約を指定することができます。
親の制約と同じ名前と条件を持つ追加制約は親の制約と統合されます。
デフォルト制約は各パーティションで別々に指定できます。
ですが、パーティションのデフォルト値は、パーティションテーブルを通してタプルを挿入する場合には適用されないことに注意してください。
パーティションテーブルに挿入された行は、自動的に正しいパーティションに回されます。 適当なパーティションが存在しないときは、エラーが発生します。
TRUNCATEのように通常はテーブルとそれを継承するすべての子テーブルに影響を及ぼす操作は、すべてのパーティションに対しても適用されますが、個別のパーティションに対して操作することも可能です。
PARTITION OFを使用してパーティションを作成するには、親のパーティション化されたテーブルでACCESS EXCLUSIVEロックを取得する必要があることに注意してください。
同様に、DROP TABLEでパーティションを削除するには、親テーブルについてACCESS EXCLUSIVEロックを取得する必要があります。
パーティション化されたテーブルでの同時操作による干渉を減らし、より弱いロックでこれらの操作を実行するため、ALTER TABLE ATTACH/DETACH PARTITIONを使用できます。
LIKE source_table [ like_option ... ] #
LIKE句にテーブルを指定すると、自動的にそのテーブルの全ての列名、そのデータ型、非NULL制約が新しいテーブルにコピーされます。
INHERITSとは違い、作成した後、新しいテーブルと元のテーブルが完全に分離されます。
元のテーブルへの変更は新しいテーブルには適用されません。また、元のテーブルを走査しても新しいテーブルのデータは見つかりません。
INHERITSと異なり、LIKEによりコピーされた列や制約は類似の名前の列や制約にまとめられません。
同じ名前が明示的に、あるいは他のLIKE句で指定された場合、エラーが通知されます。
オプションのlike_option句は元テーブルのどの追加属性をコピーするかを指定します。
INCLUDING指定は属性をコピーし、EXCLUDING指定は属性を省きます。
EXCLUDINGがデフォルトです。
同種の対象に複数の指定がある場合には最後のものが使われます。
指定可能なオプションは以下です。
INCLUDING COMMENTS #コピーされた列、制約、および、インデックスに対するコメントがコピーされます。 デフォルトの振る舞いではコメントは除外されて、新しいテーブルのコピーされた列と制約にはコメントがありません。
INCLUDING COMPRESSION #列の圧縮方式をコピーします。 デフォルトの振る舞いでは圧縮方式は除外されて、列にはデフォルトの圧縮方式が設定されます。
INCLUDING CONSTRAINTS #
CHECK制約がコピーされます。
列制約とテーブル制約の区別はされません。
非NULL制約は常に新しいテーブルにコピーされます。
INCLUDING DEFAULTS #
コピーされた列定義に対するデフォルト式をコピーします。
この指定が無い場合、デフォルト式はコピーされず、新しいテーブルのコピーされた列はNULLのデフォルトとなります。
nextvalなどのデータベースを変更する関数を呼び出すデフォルトのコピーは、元のテーブルと新しいテーブルの間で関数の連鎖を引き起こすかもしれないことに注意してください。
INCLUDING GENERATED #コピーされた列定義の全ての生成式がコピーされます。 デフォルトでは新たな列は通常の基底列となります。
INCLUDING IDENTITY #コピーされた列定義の全てのアイデンティティ指定がコピーされます。 新しいテーブルの各識別列に対して新たなシーケンスが作られ、旧テーブルに関連付けられたシーケンスとは分離されます。
INCLUDING INDEXES #
元テーブルのインデックス、および、PRIMARY KEY、UNIQUE、EXCLUDE制約が新しいテーブルに作成されます。
新しいインデックスと制約の名前はデフォルトの規則に従って決められ、元テーブルでのどう名前付けされているかは考慮されません。
(この振る舞いは新しいインデックスでの起こりうる名前重複エラーを回避します。)
INCLUDING STATISTICS #拡張統計情報が新しいテーブルにコピーされます。
INCLUDING STORAGE #
コピーされた列定義に対するSTORAGE設定がコピーされます。
デフォルトの振る舞いではSTORAGE設定は除外され、そのため新しいテーブルのコピーされた列はデータ型ごとのデフォルト設定を持ちます。
STORAGE設定に関する詳細は73.2を参照してください。
INCLUDING ALL #
INCLUDING ALLは全ての各オプションを選択することの短縮形式です。
(一部オプションを除き全てを選択するために、個別のEXCLUDING句をINCLUDING ALLの後に書く場合におそらく有益です。)
またLIKE句をビュー、外部テーブル、複合型から列の定義をコピーするために使用することができます。
適用できないオプション(ビューからのINCLUDING INDEXESなど)は無視されます。
CONSTRAINT constraint_name #
列制約、テーブル制約の名前(省略可能)です。
制約に違反すると、制約名がエラーメッセージに含まれます。
ですので、col must be positive(正数でなければならない)といった名前の制約名を付与することで、クライアントアプリケーションへ有用な制約情報を渡すことができます。
(空白を含む制約名を指定する場合、二重引用符が必要です。)
指定されなければ、システムが名前を生成します。
NOT NULL #その列がNULL値を持てないことを指定します。
NULL #その列がNULL値を持てることを指定します。 これがデフォルトです。
この句は非標準的なSQLデータベースとの互換性のためだけに提供されています。 新しいアプリケーションでこれを使用するのはお勧めしません。
CHECK ( expression ) [ NO INHERIT ] #
CHECK句は、論理型の結果を生成する、新しい行または更新される行が挿入または更新処理を成功させるために満足しなければならない式を指定します。
TRUEまたはUNKNOWNと評価される式は成功します。
挿入または更新処理の行がFALSEという結果をもたらす場合はエラー例外が発生し、その挿入または更新によるデータベースの変更は行われません。
列制約として指定された検査制約は列の値のみを参照しなければなりません。
テーブル制約内の式は複数の列を参照できます。
現時点では、CHECK式には副問い合わせも現在の行の列以外の変数も含めることはできません(5.4.1を参照)。
システム列tableoidを参照することはできますが、他のシステム列は参照できません。
NO INHERITと印が付いた制約は子テーブルには伝搬しません。
テーブルに複数のCHECK制約がある場合、それらはNOT NULL制約について検証した後で、各行について名前のアルファベット順に検証されます。
(PostgreSQLの9.5より前のバージョンでは、CHECK制約の実行について特定の順序はありませんでした。)
DEFAULT
default_expr #
DEFAULT句を列定義に付けると、その列にデフォルトデータ値が割り当てられます。
値として指定するのは任意の無変数式です(特に現在のテーブル内の他の列へクロス参照はできません)。
副問い合わせも指定できません。
デフォルト式のデータ型はその列のデータ型と一致する必要があります。
デフォルト式は、全ての挿入操作において、その列に値が指定されていない場合に使用されます。 列にデフォルト値がない場合、デフォルト値はNULLになります。
GENERATED ALWAYS AS ( generation_expr ) STORED #この句は列を生成列として作成します。 この列には書き込みできず、読むときには指定された式の結果が返されます。
キーワードSTOREDは列が書き込み時に計算されてディスクに格納されることをあらわすのに必要とされます。
生成式はそのテーブルの他の列を参照できますが、他の生成列は参照できません。 使われる全ての関数と演算子はIMMUTABLEでなければなりません。 他テーブルを参照することはできません。
GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY [ ( sequence_options ) ] #
この句は列をIDENTITY列として作成します。
それには暗黙のシーケンスが紐付けられ、新しい行のその列には紐付けられたシーケンスから取られた値が自動的に入ります。
そのような列は暗黙的にNOT NULLです。
ALWAYSとBY DEFAULTの句は、INSERTやUPDATEコマンドで明示的にユーザが指定した値をどのように扱うかを決定します。
INSERTコマンドでは、ALWAYSが選択された場合、ユーザの指定した値はINSERT文がOVERRIDING SYSTEM VALUEを指定している場合にのみ受け付けられます。
BY DEFAULTが選択された場合、ユーザの指定した値が優先します。
詳細はINSERTを参照してください。
(COPYコマンドでは、この設定に関係なく、ユーザの指定した値が常に使われます。)
UPDATEでは、ALWAYSが選択された場合、DEFAULT以外の値への列の更新は拒絶されます。
BY DEFAULTが選択された場合、列は普通に更新されます。
(UPDATEコマンドにOVERRIDING句はありません。)
オプションでsequence_options句を指定することにより、シーケンスのオプションを変更できます。
詳しくはCREATE SEQUENCEを参照してください。
UNIQUE [ NULLS [ NOT ] DISTINCT ] (列制約)UNIQUE [ NULLS [ NOT ] DISTINCT ] ( column_name [, ... ] )
[ INCLUDE ( column_name [, ...]) ] (テーブル制約) #
UNIQUE制約は、テーブルの1つまたは複数の列からなるグループが、一意な値のみを持つことができることを指定します。
一意性テーブル制約の動作は一意性列制約と同じですが、さらに複数列にまたがる機能を持ちます。
それゆえ、制約は2つの行はその列の少なくとも1つが異なることを強制します。
一意性制約では、NULLS NOT DISTINCTが指定されない限り、NULL値同士は等しいとはみなされなせん。
それぞれの一意性制約には、そのテーブルの他の一意性制約もしくは主キー制約によって指定された列の集合とは、異なる列の集合を指定しなければなりません。 (そうでなければ、余分な一意性制約は捨てられます。)
複数レベルのパーティション階層に一意性制約を設定するとき、対象パーティションテーブル、および全ての子孫のパーティションテーブルの、パーティションキー内の全ての列が制約定義に含まれなくてはなりません。
一意性制約を加えると、制約で使われている列や列のグループに一意性btreeインデックスが自動的に作られます。
省略可能なINCLUDE句はインデックスに単に「ペイロード」である列を1つまたは複数、追加します。一意性はその列には強要されず、その列に基づいてインデックスが検索されることはありません。
しかしながら、インデックスオンリースキャンでは取り出すことができます。
含めた(INCLUDEした)列に制約は強制されませんが、依存はしていることに注意してください。
このため、これらの列に対する一部の操作(例えばDROP COLUMN)は制約の連鎖とインデックスの削除をひき起こすことがあります。
PRIMARY KEY (列制約)PRIMARY KEY ( column_name [, ... ] )
[ INCLUDE ( column_name [, ...]) ] (テーブル制約) #
PRIMARY KEY制約はテーブルの一列または複数の列が一意(重複がない)で、非NULLの値のみを持つことを指定します。
列制約かテーブル制約かに関わらず、1つのテーブルには主キーを1つだけ指定できます。
主キー制約では、同じテーブルに一意制約で指定した列の集合とは異なる列の集合を指定します。 (そうでなければ、一意制約は冗長となり、捨てられます。)
PRIMARY KEYはUNIQUEとNOT NULLの組み合わせと同じデータ制約を課します。
ですが、列の集合を主キーと指定することは、スキーマの設計についてのメタデータを提供することにもなります。
なぜなら、主キーであることは、行を一意に特定するものとして、他のテーブルがその列の集合を当てにして良い、ということを意味するからです。
パーティションテーブルに設定すると、PRIMARY KEY制約は、以前述べた制限をUNIQUE制約と共有します。
PRIMARY KEY制約を追加すると、制約で使用する列や列のグループに一意性のbtreeインデックスが自動的に作られます。
省略可能なINCLUDE句はインデックスに単に「ペイロード」である列を1つまたは複数、追加します。一意性はその列には強要されず、その列に基づいてインデックスが検索されることはありません。
しかしながら、インデックスオンリースキャンでは取り出すことができます。
含めた列に一意性は強制されませんが、制約はこれらに依存はしています。
このため、これらの列に対する一部の操作(例えばDROP COLUMN)は制約の連鎖とインデックスの削除をひき起こすことがあります。
EXCLUDE [ USING index_method ] ( exclude_element WITH operator [, ... ] ) index_parameters [ WHERE ( predicate ) ] #
EXCLUDE句は排他制約を定義し、任意の2行について指定した列(複数可)または式(複数可)を指定した演算子(複数可)を使用して比較した場合、比較結果のすべてがTRUEを返さないことを保証します。
指定した演算子のすべてが等価性を試験するものであれば、これはUNIQUE制約と同じですが、通常の一意性制約のほうが高速です。
しかし、排他制約では単純な等価性よりも一般的な制約を指定することができます。
例えば、テーブル内の2つの行が重複する円(8.8参照)を持たないといった制約を&&演算子を使用して指定することができます。
演算子は可換であることが必要です。
排他制約はインデックスを使用して実装されています。
このため指定した演算子はそれぞれ適切な演算子クラス(11.10参照)でindex_methodインデックスアクセスメソッドと関連付けされていなければなりません。
各exclude_elementはインデックスの列を定義しますので、オプションで、照合順序、演算子クラス、演算子クラスパラメータ、および/または順序付けオプションを指定できます。これらについてはCREATE INDEXで説明します。
アクセスメソッドはamgettupleをサポートしなければなりません(第64章参照)。
現時点では、これはGINを使用できないことを意味します。
B-treeやHashインデックスを排他制約で使用することは許容されますが、そうすることにあまり意味はありません。
これが通常の一意性制約より良いことは何もないからです。
このため現実的にはアクセスメソッドは常にGiSTもしくはSP-GiSTとなります。
predicateにより、排他制約をテーブルの部分集合に指定することができます。
内部的には、これは部分インデックスを作成します。
predicateの前後に括弧が必要であることに注意して下さい。
REFERENCES reftable [ ( refcolumn ) ] [ MATCH matchtype ] [ ON DELETE action ] [ ON UPDATE action ] (列制約)FOREIGN KEY ( column_name [, ... ] )
REFERENCES reftable [ ( refcolumn [, ... ] ) ]
[ MATCH matchtype ]
[ ON DELETE referential_action ]
[ ON UPDATE referential_action ]
(表制約) #
これらの句は、外部キー制約を指定します。
外部キー制約は、新しいテーブルの1つまたは複数の列の集合が、被参照テーブルの一部の行の被参照列に一致する値を持たなければならないことを指定するものです。
refcolumnリストが省略された場合、reftableの主キーが使用されます。
そうでない場合、refcolumnリストは遅延不可の一意性または主キー制約の列を参照するか、部分インデックスでない一意インデックスの列でなければなりません。
被参照列は、被参照テーブルにおいて遅延不可の一意性制約もしくは主キー制約を持った列でなければなりません。
ユーザは被参照テーブル(テーブル全体または特定の被参照列)についてREFERENCES権限を持っていなければなりません。
外部キー制約の追加は被参照テーブルにSHARE ROW EXCLUSIVEロックを必要とします。
一時テーブルと永続テーブルとの間で外部キー制約を定義できないことに注意してください。
参照列に挿入された値は、被参照テーブルと被参照列の値に対して、指定した照合型で照会されます。
照合型には3種類があります。
MATCH FULL、MATCH PARTIAL、MATCH SIMPLE(これがデフォルト)照合型です。
MATCH FULLは全ての外部キー列がNULLとなる場合を除き、複数列外部キーのある列がNULLとなることを許可しません。
それらがすべてNULLであれば、その行は被参照テーブル内で一致があることは要求されません。
MATCH SIMPLEは、外部キーの一部がNULLであることを許可します。
それらの一部がNULLであれば、その行は被参照テーブル内で一致があることは要求されません。
MATCH PARTIALはまだ実装されていません。
(当然ですが、NOT NULL制約を参照列に適用し、こうした状態が発生することを防止することができます。)
さらに、被参照列のデータが変更された場合、このテーブルの列のデータに何らかの動作が発生します。
ON DELETE句は、被参照テーブルの被参照行が削除されようとした場合の動作を指定します。
同様にON UPDATE句は、被参照テーブルの被参照列が新しい値に更新されようとした場合の動作を指定します。
行の更新があった場合でも、被参照列が実際に変更されない場合は、動作は実行されません。
制約が遅延可能と宣言されていても、NO ACTION検査以外の参照動作は遅延させられません。
各句について、以下の動作を指定可能です。
NO ACTION #削除もしくは更新により外部キー制約違反が起こることを示すエラーを発生します。 制約が遅延可能な場合、何らかの参照行が存在する限り、このエラーは制約の検査時点で発生します。 これはデフォルトの動作です。
RESTRICT #
削除もしくは更新が外部キー制約違反となることを示すエラーを発生します。
検査が遅延できない点を除き、NO ACTIONと同じです。
CASCADE #削除された行を参照している行は全て削除します。また、参照している列の値を、被参照列の新しい値にします。
SET NULL [ ( column_name [, ... ] ) ] #
すべての参照列または参照列の指定したサブセットをNULLに設定します。
列のサブセットは、ON DELETEアクションに対してのみ指定できます。
SET DEFAULT [ ( column_name [, ... ] ) ] #
すべての参照列または参照列の指定したサブセットをそのデフォルト値に設定します。
列のサブセットは、ON DELETEアクションに対してのみ指定できます。
(デフォルト値がNULLでない場合は被参照テーブルの中にデフォルト値に一致する行が存在しなければなりません。さもないと操作が失敗します。)
被参照列が頻繁に更新される場合、参照列にインデックスを付け、その外部キー制約に関連する参照動作がより効率的に実行できるようにする方が良いでしょう。
DEFERRABLENOT DEFERRABLE #
制約を遅延させることが可能かどうかを制御します。
遅延不可の制約は各コマンドの後すぐに検査されます。
遅延可能な制約の検査は、(SET CONSTRAINTSコマンドを使用して)トランザクションの終了時まで遅延させることができます。
NOT DEFERRABLEがデフォルトです。
現在、UNIQUE、PRIMARY KEY、EXCLUDE、REFERENCES(外部キー)制約のみがこの句を受け付けることができます。
NOT NULLおよび CHECK制約は遅延させることができません。
遅延可能な制約はON CONFLICT DO UPDATE句を含むINSERT文において、競合解決のために使うことはできないことに注意してください。
INITIALLY IMMEDIATEINITIALLY DEFERRED #
制約が遅延可能な場合、この句は制約検査を行うデフォルトの時期を指定します。
制約がINITIALLY IMMEDIATEの場合、各文の実行後に検査されます。
これがデフォルトです。
制約がINITIALLY DEFERREDの場合、トランザクションの終了時にのみ検査されます。
制約検査の時期はSET CONSTRAINTSコマンドを使用して変更することができます。
USING method #
このオプションの句は新しいテーブルの中身の格納に用いるテーブルアクセスメソッドを指定します。指定するものは、TABLEタイプのアクセスメソッドでなければなりません。
より詳しい情報は第63章を参照してください。
このオプションが指定されない場合、新しいテーブルにはデフォルトテーブルアクセスメソッドが選択されます。
より詳しい情報はdefault_table_access_methodを参照してください。
WITH ( storage_parameter [= value] [, ... ] ) #
この句はテーブルまたはインデックスに対するオプションの格納パラメータを指定します。
詳しくは格納パラメータを参照してください。
後方互換性のため、テーブルに対するWITH句には新しいテーブルの行にOID(オブジェクト識別子)が含まれないことを示すためにOIDS=FALSEを含めることもできます。OIDS=TRUEはもはやサポートされません。
WITHOUT OIDS #
これはWITHOUT OIDSのテーブルと宣言する後方互換性の構文です。
WITH OIDSのテーブルを作ることはもはやサポートされません。
ON COMMIT #
ON COMMITを使用して、トランザクションブロックの終了時点での一時テーブルの動作を制御することができます。
以下の3つのオプションがあります。
PRESERVE ROWS #トランザクションの終了時点で、特別な動作は行われません。 これがデフォルトの動作です。
DELETE ROWS #
一時テーブル内の全ての行は、各トランザクションブロックの終わりで削除されます。
実質的には、コミットの度に自動的にTRUNCATEが実行されます。
パーティションテーブルに使われた場合、そのパーティションに連鎖適用はされません。
DROP #一時テーブルは現在のトランザクションブロックの終わりで削除されます。 この動作は、パーティションテーブルに使われたときにそのパーティションを削除し、継承の子テーブルを伴うテーブルに使われたときに従属する子テーブルを削除します。
TABLESPACE tablespace_name #
tablespace_nameは、新しいテーブルが作成されるテーブル空間名です。
指定されていない場合、default_tablespaceが、また一時テーブルの場合はtemp_tablespacesが考慮されます。
パーティションテーブルに対しては、そのテーブル自身ではストレージは必要としないため、他のテーブル空間が明示的に指定されていないときに新しく作成されたパーティションに使用するデフォルトのテーブル空間として、指定されたテーブル空間がdefault_tablespaceを上書きします。
USING INDEX TABLESPACE tablespace_name #
この句により、UNIQUE、PRIMARY KEY、またはEXCLUDE制約に関連したインデックスを作成するテーブル空間を選択することができます。
指定されていない場合、default_tablespaceが、また一時テーブルであればtemp_tablespacesが考慮されます。
WITH句により、テーブルおよびUNIQUE、PRIMARY KEY、またはEXCLUDE制約と関連づいたインデックスの格納パラメータを指定することができます。
インデックスの格納パラメータについてはCREATE INDEXで説明します。
現在テーブルで設定可能な格納パラメータの一覧を以下に示します。
これらのパラメータの多くに対して、示した通り、さらにtoastという接頭辞のついた、同一の名前のパラメータがあります。
これはもしあれば、テーブルの補助TOASTテーブルの動作を制御します。
(TOASTに関する詳細については73.2を参照してください。)
テーブルのパラメータ値が設定され、それと同等のtoast.パラメータが設定されていない場合、TOASTテーブルはテーブルのパラメータ値を利用します。
これらのパラメータをパーティションテーブルについて指定することはサポートされませんが、個々の末端のパーティションについて指定することはできます。
fillfactor (integer)
#
テーブルのフィルファクタ(fillfactor)は10から100までの間の割合(パーセント)です。
100(すべて使用)がデフォルトです。
より小さな値を指定すると、INSERT操作は指定した割合までしかテーブルページを使用しません。
各ページの残りの部分は、そのページ内の行の更新用に予約されます。
これによりUPDATEは、元の行と同じページ上に更新済みの行を格納することができるようになります。
これは別のページに更新済みの行を格納することよりも効率的であり、おそらくより多くヒープ専用タプルの更新を行ないます。
項目の更新がまったくないテーブルでは、すべてを使用することが最善の選択ですが、更新が非常に多いテーブルではより小さめのフィルファクタが適切です。
TOASTテーブルではこのパラメータを設定できません。
toast_tuple_target (integer)
#toast_tuple_targetは、長い列値を圧縮したりTOASTテーブルに移動する前に必要とされる最小タプル長を指定します。また、これはTOAST化を開始したときに長さをそれ未満に減らそうとする目標にもなります。 これはEXTERNAL(移動に対して)、MAIN(圧縮に対して)、または、EXTENDED(両方に対して)と印付けされた列に影響があり、また、新たなタプルにのみ適用されます。 既存の行には影響ありません。 デフォルトでは、このパラメータは1ブロックあたり少なくとも4タプルが可能であるように設定されます。これはデフォルトブロックサイズであれば2040バイトになります。 有効な値は128バイトから、ブロックサイズ - ヘッダ(デフォルトでは8160バイト)の間です。 非常に短いあるいは長い行に対して、この値を変更することはおそらく有用ではありません。 時にはデフォルト設定が最適に近く、本パラメータを設定することで場合によっては悪影響があるかもしれないことに注意してください。
parallel_workers (integer)
#このテーブルの並列スキャンを支援するために使用されるワーカーの数を設定します。 設定されなければ、リレーションのサイズに基づいてシステムが値を決定します。 プランナやパラレルスキャンを使うユーティリティ文により選ばれるワーカーの数は、例えばmax_worker_processesの設定によって、より少なくなるかもしれません。
autovacuum_enabled, toast.autovacuum_enabled (boolean)
#
特定のテーブルに対する自動バキュームデーモンを有効または無効にします。
trueの場合、自動バキュームデーモンは、25.1.6に記述されたルールに従って、このテーブルに対して自動的にVACUUMあるいはANALYZEまたはその両方の操作を行います。
falseの場合、トランザクションIDの周回問題を回避するためを除き自動バキュームは行われません。
周回問題の回避については25.1.5を参照してください。
autovacuumパラメータがfalseの場合、(トランザクションIDの周回問題を回避する場合を除き)自動バキュームデーモンはまったく実行されないことに注意して下さい。
個々のテーブルの格納パラメータを設定しても、それは優先されません。
従って、この格納パラメータを明示的にtrueに設定することにはほとんど意味はなく、falseに設定することのみが意味を持ちます。
vacuum_index_cleanup, toast.vacuum_index_cleanup (enum)
#
このテーブルにVACUUMが実行されたときのインデックスのクリーンアップを強制または無効にします。
デフォルト値はAUTOです。
OFFでインデックスのクリーンアップは無効になり、ONで有効に、AUTOでその時々のVACUUM実行時に決定が動的に行なわれるようになります。
動的な動作により、ほとんどない無効タプル削除するために必要もないのにインデックスをスキャンしてしまうことをVACUUMが避けられるようになります。
インデックスのクリーンアップを強制的にすべて無効にすることで、VACUUMを大幅に高速化できますが、テーブルの変更が頻繁である場合には深刻なインデックスの肥大化も生じさせるかもしれません。
VACUUMのINDEX_CLEANUPパラメータは、指定されていたなら本オプションを上書きします。
vacuum_truncate, toast.vacuum_truncate (boolean)
#
バキュームがテーブル末尾の空ページの切り捨てを試みることを、有効または無効にします。
デフォルト値はtrueです。
trueの場合、VACUUMと自動バキュームは切り捨てを行い切り捨てられたページのディスク領域はオペレーティングシステムに返されます。
切り捨てにはテーブルにACCESS EXCLUSIVEロックが必要であることに注意してください。
VACUUMのTRUNCATEパラメータは、指定されていたなら本オプションを上書きします。
autovacuum_vacuum_threshold, toast.autovacuum_vacuum_threshold (integer)
#autovacuum_vacuum_thresholdパラメータについて、テーブル毎に設定する値です。
autovacuum_vacuum_scale_factor, toast.autovacuum_vacuum_scale_factor (floating point)
#autovacuum_vacuum_scale_factorパラメータについて、テーブル毎に設定する値です。
autovacuum_vacuum_insert_threshold, toast.autovacuum_vacuum_insert_threshold (integer)
#autovacuum_vacuum_insert_thresholdパラメータについて、テーブル毎に設定する値です。 特別な値である-1は、テーブルでのインサートバキュームを無効にするのに使われます。
autovacuum_vacuum_insert_scale_factor, toast.autovacuum_vacuum_insert_scale_factor (floating point)
#autovacuum_vacuum_insert_scale_factorパラメータについて、テーブル毎に設定する値です。
autovacuum_analyze_threshold (integer)
#autovacuum_analyze_thresholdパラメータについて、テーブル毎に設定する値です。
autovacuum_analyze_scale_factor (floating point)
#autovacuum_analyze_scale_factorパラメータについて、テーブル毎に設定する値です。
autovacuum_vacuum_cost_delay, toast.autovacuum_vacuum_cost_delay (floating point)
#autovacuum_vacuum_cost_delayパラメータについて、テーブル毎に設定する値です。
autovacuum_vacuum_cost_limit, toast.autovacuum_vacuum_cost_limit (integer)
#autovacuum_vacuum_cost_limitパラメータについて、テーブル毎に設定する値です。
autovacuum_freeze_min_age, toast.autovacuum_freeze_min_age (integer)
#
vacuum_freeze_min_ageパラメータについて、テーブル毎に設定する値です。
テーブル単位のautovacuum_freeze_min_ageパラメータをシステム全体のautovacuum_freeze_max_age設定の1/2より大きく設定しても、自動バキュームが無視することに注意してください。
autovacuum_freeze_max_age, toast.autovacuum_freeze_max_age (integer)
#
autovacuum_freeze_max_ageパラメータについて、テーブル毎に設定する値です。
テーブル単位のautovacuum_freeze_max_ageパラメータをシステム全体に対する設定より大きく設定しても、自動バキュームが無視することに注意してください(より小さな値しか設定できません)。
autovacuum_freeze_table_age, toast.autovacuum_freeze_table_age (integer)
#vacuum_freeze_table_ageパラメータについて、テーブル毎に設定する値です。
autovacuum_multixact_freeze_min_age, toast.autovacuum_multixact_freeze_min_age (integer)
#
vacuum_multixact_freeze_min_ageパラメータについて、テーブル毎に設定する値です。
テーブル単位のautovacuum_multixact_freeze_min_ageパラメータをシステム全体のautovacuum_multixact_freeze_max_ageの半分より大きく設定しても、自動バキュームが無視することに注意してください。
autovacuum_multixact_freeze_max_age, toast.autovacuum_multixact_freeze_max_age (integer)
#
autovacuum_multixact_freeze_max_ageパラメータについて、テーブル毎に設定する値です。
テーブル単位のautovacuum_multixact_freeze_max_ageをシステム全体に対する設定より大きくしても、自動バキュームが無視することに注意してください(より小さな値しか設定できません)。
autovacuum_multixact_freeze_table_age, toast.autovacuum_multixact_freeze_table_age (integer)
#vacuum_multixact_freeze_table_ageパラメータについて、テーブル毎に設定する値です。
log_autovacuum_min_duration, toast.log_autovacuum_min_duration (integer)
#log_autovacuum_min_durationパラメータについて、テーブル毎に設定する値です。
user_catalog_table (boolean)
#テーブルを論理レプリケーションのための追加のカタログテーブルとして宣言します。 詳しくは49.6.2を参照してください。 このパラメータはTOASTテーブルには設定できません。
PostgreSQLは自動的に各一意性制約と主キー制約に対してインデックスを作成し、その一意性を確実なものにします。 したがって、主キーの列に明示的にインデックスを作成することは必要ありません (詳細についてはCREATE INDEXを参照してください)。
現在の実装では、一意性制約と主キーは継承されません。 これは、継承と一意性制約を組み合わせると障害が発生するからです。
テーブルは1600列以上の列を持つことはできません (タプル長の制限により実際の制限はもっと小さくなります)。
filmsテーブルとdistributorsテーブルを作成します。
CREATE TABLE films (
code char(5) CONSTRAINT firstkey PRIMARY KEY,
title varchar(40) NOT NULL,
did integer NOT NULL,
date_prod date,
kind varchar(10),
len interval hour to minute
);
CREATE TABLE distributors (
did integer PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY,
name varchar(40) NOT NULL CHECK (name <> '')
);
2次元配列を持つテーブルを作成します。
CREATE TABLE array_int (
vector int[][]
);
filmsテーブルに 一意性テーブル制約を定義します。
一意性テーブル制約はテーブルの1つ以上の列に定義することができます。
CREATE TABLE films (
code char(5),
title varchar(40),
did integer,
date_prod date,
kind varchar(10),
len interval hour to minute,
CONSTRAINT production UNIQUE(date_prod)
);
検査列制約を定義します。
CREATE TABLE distributors (
did integer CHECK (did > 100),
name varchar(40)
);
検査テーブル制約を定義します。
CREATE TABLE distributors (
did integer,
name varchar(40),
CONSTRAINT con1 CHECK (did > 100 AND name <> '')
);
filmsテーブルに主キーテーブル制約を定義します。
CREATE TABLE films (
code char(5),
title varchar(40),
did integer,
date_prod date,
kind varchar(10),
len interval hour to minute,
CONSTRAINT code_title PRIMARY KEY(code,title)
);
distributorsテーブルに主キー制約を定義します。
以下の2つの例は同等で、前者はテーブル制約構文を使用し、後者は列制約構文を使用します。
CREATE TABLE distributors (
did integer,
name varchar(40),
PRIMARY KEY(did)
);
CREATE TABLE distributors (
did integer PRIMARY KEY,
name varchar(40)
);
以下では、name列のデフォルト値にリテラル定数を割り当てています。また、did列のデフォルト値として、シーケンスオブジェクトの次の値が生成されるように調整しています。
modtimeのデフォルト値は、その行が挿入された時刻となります。
CREATE TABLE distributors (
name varchar(40) DEFAULT 'Luso Films',
did integer DEFAULT nextval('distributors_serial'),
modtime timestamp DEFAULT current_timestamp
);
2つのNOT NULL列制約をdistributorsテーブルに定義します。
そのうち1つには明示的な名前を付けています。
CREATE TABLE distributors (
did integer CONSTRAINT no_null NOT NULL,
name varchar(40) NOT NULL
);
name列に対し、一意性制約を定義します。
CREATE TABLE distributors (
did integer,
name varchar(40) UNIQUE
);
上と同じですが、テーブル制約として指定します。
CREATE TABLE distributors (
did integer,
name varchar(40),
UNIQUE(name)
);
テーブルとその一意性インデックスの両方に70%のフィルファクタを指定して、同じテーブルを作成します。
CREATE TABLE distributors (
did integer,
name varchar(40),
UNIQUE(name) WITH (fillfactor=70)
)
WITH (fillfactor=70);
2つの円の重複を許さない排他制約を持つcirclesテーブルを作成します。
CREATE TABLE circles (
c circle,
EXCLUDE USING gist (c WITH &&)
);
diskvol1テーブル空間にcinemasテーブルを作成します。
CREATE TABLE cinemas (
id serial,
name text,
location text
) TABLESPACE diskvol1;
複合型と型付きテーブルを作成します。
CREATE TYPE employee_type AS (name text, salary numeric);
CREATE TABLE employees OF employee_type (
PRIMARY KEY (name),
salary WITH OPTIONS DEFAULT 1000
);
範囲パーティションテーブルを作成します。
CREATE TABLE measurement (
logdate date not null,
peaktemp int,
unitsales int
) PARTITION BY RANGE (logdate);
パーティションキーに複数の列がある範囲パーティションテーブルを作成します。
CREATE TABLE measurement_year_month (
logdate date not null,
peaktemp int,
unitsales int
) PARTITION BY RANGE (EXTRACT(YEAR FROM logdate), EXTRACT(MONTH FROM logdate));
リストパーティションテーブルを作成します。
CREATE TABLE cities (
city_id bigserial not null,
name text not null,
population bigint
) PARTITION BY LIST (left(lower(name), 1));
ハッシュパーティションテーブルを作成します。
CREATE TABLE orders (
order_id bigint not null,
cust_id bigint not null,
status text
) PARTITION BY HASH (order_id);
範囲パーティションテーブルのパーティションを作成します。
CREATE TABLE measurement_y2016m07
PARTITION OF measurement (
unitsales DEFAULT 0
) FOR VALUES FROM ('2016-07-01') TO ('2016-08-01');
パーティションキーに複数の列がある範囲パーティションテーブルに、パーティションをいくつか作成します。
CREATE TABLE measurement_ym_older
PARTITION OF measurement_year_month
FOR VALUES FROM (MINVALUE, MINVALUE) TO (2016, 11);
CREATE TABLE measurement_ym_y2016m11
PARTITION OF measurement_year_month
FOR VALUES FROM (2016, 11) TO (2016, 12);
CREATE TABLE measurement_ym_y2016m12
PARTITION OF measurement_year_month
FOR VALUES FROM (2016, 12) TO (2017, 01);
CREATE TABLE measurement_ym_y2017m01
PARTITION OF measurement_year_month
FOR VALUES FROM (2017, 01) TO (2017, 02);
リストパーティションテーブルのパーティションを作成します。
CREATE TABLE cities_ab
PARTITION OF cities (
CONSTRAINT city_id_nonzero CHECK (city_id != 0)
) FOR VALUES IN ('a', 'b');
リストパーティションテーブルにパーティションを作成しますが、それ自体がさらにパーティションになり、それにパーティションを追加します。
CREATE TABLE cities_ab
PARTITION OF cities (
CONSTRAINT city_id_nonzero CHECK (city_id != 0)
) FOR VALUES IN ('a', 'b') PARTITION BY RANGE (population);
CREATE TABLE cities_ab_10000_to_100000
PARTITION OF cities_ab FOR VALUES FROM (10000) TO (100000);
ハッシュパーティションテーブルのパーティションを作成します。
CREATE TABLE orders_p1 PARTITION OF orders
FOR VALUES WITH (MODULUS 4, REMAINDER 0);
CREATE TABLE orders_p2 PARTITION OF orders
FOR VALUES WITH (MODULUS 4, REMAINDER 1);
CREATE TABLE orders_p3 PARTITION OF orders
FOR VALUES WITH (MODULUS 4, REMAINDER 2);
CREATE TABLE orders_p4 PARTITION OF orders
FOR VALUES WITH (MODULUS 4, REMAINDER 3);
デフォルトのパーティションを作成します。
CREATE TABLE cities_partdef
PARTITION OF cities DEFAULT;
CREATE TABLEは、以下に挙げるものを除いて、標準SQLに従います。
CREATE TEMPORARY TABLEは標準SQLに類似していますが、その効果は同じではありません。
標準では、一時テーブルは一度だけ定義され、それを必要とするセッションごとに自動的に(空の内容で始まる形で)出現します。
PostgreSQLでは、これと異なり、各セッションで独自に、使用する一時テーブル用のCREATE TEMPORARY TABLEコマンドを発行しなければなりません。
これにより、異なるセッションで同じ名前の一時テーブルを異なる目的で使用することができます。
一方、標準の方法では、ある一時テーブル名を持つインスタンスが、全て同一のテーブル構造を持つという制限があります。
標準における一時テーブルの動作定義の多くは無視されています。 この点でのPostgreSQLの動作は、他の多くのSQLデータベースと似ています。
また標準SQLではグローバル一時テーブルとローカル一時テーブルを区別しています。 ローカル一時テーブルは各セッション内のSQLモジュールそれぞれ用に内容の集合を分離しますが、その定義はセッション全体で共有されます。 PostgreSQLはSQLモジュールをサポートしませんので、PostgreSQLではこの区別は適切ではありません。
互換性を保持するため、PostgreSQLは一時テーブルの宣言においてGLOBALとLOCALキーワードを受け付けますが、これらには現在、何の効果もありません。
PostgreSQLの今後のバージョンでは、これらの意味についてより標準に近い実装を取り入れる可能性がありますので、これらのキーワードの使用は勧めません。
一時テーブル用のON COMMIT句もまた、標準SQLに類似していますが、いくつか違いがあります。
ON COMMIT句が省略された場合、SQLでは、デフォルトの動作はON COMMIT DELETE ROWSであると規定しています。
しかし、PostgreSQLでのデフォルトの動作はON COMMIT PRESERVE ROWSです。
また、ON COMMIT DROPはSQLにはありません。
UNIQUEまたはPRIMARY KEY制約が非遅延の場合、PostgreSQLは行が挿入または変更されると即座に一意性を検査します。
標準SQLでは一意性は文が完了した時にのみ強制されなければならないと記述しています。
これにより、たとえば、1つのコマンドが複数のキー値を更新する時に違いが現れます。
標準互換の動作をさせるためには、非遅延(つまりINITIALLY IMMEDIATE)ではなくDEFERRABLEとして制約を宣言してください。
これが即座に行われる一意性検査よりかなり低速になる可能性があることに注意してください。
標準SQLでは、CHECK列制約はそれを適用する列のみを参照でき、複数の列を参照できるのはCHECKテーブル制約のみであるとされています。
PostgreSQLにはこの制限はありません。
列検査制約とテーブル検査制約を同様のものとして扱っています。
EXCLUDE制約
EXCLUDEという種類の制約はPostgreSQLの拡張です。
外部キーアクションSET DEFAULTとSET NULLで列のリストを指定する機能はPostgreSQLの拡張です。
外部キー制約が、主キーまたは一意性制約の列ではなく、一意インデックスの列を参照できるのはPostgreSQLの拡張です。
NULL 「制約」
NULL「制約」(実際には非制約)は、標準SQLに対するPostgreSQLの拡張で、他のいくつかのデータベースシステムとの互換性(および NOT NULL制約との対称性)のために含まれています。
どんな列に対してもデフォルトとなるため、これには意味はありません。
SQL標準ではテーブルとドメインの制約はテーブルやドメインを含むスキーマ中で一意な名前を持たなければなりません。
PostgreSQLはより緩やかで、制約名は特定のテーブルやドメインに付加された制約の中で一意であることだけが求められます。
しかしながら、この追加的な自由はインデックスに基づく制約(UNIQUE、PRIMARY KEY、およびEXCLUDE制約)にはありません。なぜなら、関連付けられたインデックスは制約と同じに命名されて、インデックス名は同スキーマ内の全てのリレーションの中で一意でなければならないからです。
今のところ、PostgreSQLはNOT NULL制約の名前を全く記録しませんので、これらは一意性の制限の対象ではありません。
これは将来のリリースで変更されるかもしれません。
INHERITS句による複数継承は、PostgreSQLの言語拡張です。
SQL:1999以降では、異なる構文と意味体系による単一継承を定義しています。
今のところ、SQL:1999方式の継承はPostgreSQLではサポートされていません。
PostgreSQLでは、列を持たないテーブルを作成することができます
(例えば、CREATE TABLE foo();)。
これは標準SQLからの拡張です。
標準SQLでは列を持たないテーブルは許されません。
列を持たないテーブルそれ自体は役に立ちませんが、これを無効とすると、ALTER TABLE DROP COLUMNに対して奇妙な特例を生成することになります。
したがって、この仕様上の制限を無視する方が簡潔であると考えます。
PostgreSQLではテーブルに2つ以上のIDENTITY列を持つことを許しています。
標準SQLでは、1つのテーブルは最大で1つのIDENTITY列を持つことができると規定しています。
主にスキーマの変更や移行でより柔軟性を持たせるために、この制約を緩和しています。
INSERTコマンドはOVERRIDING句を1つだけしかサポートせず、これが文全体に適用されるため、複数のIDENTITY列があり、これらの動作が異なる場合は正しくサポートされないことに注意してください。
オプションSTOREDは標準ではありませんが他のSQL実装でも使われています。SQL標準は生成列の格納を規定していません。
LIKE句
LIKE句は標準SQLにありますが、PostgreSQLで利用可能な多くのオプションは標準にはなく、また標準のオプションの一部はPostgreSQLでは実装されていません。
WITH句
WITH句はPostgreSQLの拡張です。
格納パラメータは標準にはありません。
PostgreSQLのテーブル空間の概念は標準にはありません。
したがって、TABLESPACEとUSING INDEX TABLESPACEは、PostgreSQLにおける拡張です。
型付きテーブルは標準SQLのサブセットを実装します。 標準に従うと、型付きテーブルは背後の複合型に対応した列の他に「自己参照列」という列も持ちます。 PostgreSQLは自己参照列を明示的にサポートしません。
PARTITION BY句
PARTITION BYはPostgreSQLの拡張です。
PARTITION OF句
PARTITION OF句はPostgreSQLの拡張です。