new_schemaここで、actionは以下のいずれかです。new_tablespacetable_constraint_using_indexは以下のいずれかです。TABLEは既存のテーブルの定義を変更します。このコマンドには、次のような副構文があります。TABLEと同じ構文を使って新しい列をテーブルに追加できます。]この構文を使用すると、テーブルから列を削除できます。削除する列を含んでいるインデックスおよびテーブル制約も自動的に削除されます。削除する列にテーブル以外(例えば、外部キー制約、ビューなど)が依存している場合、CASCADEを付ける必要があります。EXISTSが指定されている場合、もしその列がなかったとしてもエラーにはなりません。この場合は代わりに注意が出力されます。EXISTSテーブルが存在しない場合でもエラーとしません。この場合は注意メッセージが発行されます。TYPEこの構文を使用すると、テーブルの列の型を変更できます。その列を含むインデックスと簡単なテーブル制約は、元々与えられた式を再解析し、新しい型を使用するように自動的に変換されます。省略可能なCOLLATE句は、新しい列の照合順を指定します。省略時の照合順は新しい列の型のデフォルトになります。USING句は、古い列値をどのように新しい値に計算するかを指定します。この句は省略可能です。省略された場合、デフォルトの変換は、古いデータ型から新しいデータ型への代入キャストと同じになります。古いデータ型から新しいデータ型への暗黙キャストあるいは代入キャストがない場合、USING句を指定しなければなりません。DEFAULTこれらの構文を使用すると、列のデフォルト値を設定または削除できます。デフォルト値は、変更後に行われるINSERTコマンドのみに適用されます。テーブル内の既存の行は変更されません。NULLこれらの構文は、列の値としてNULL値を使用できるかどうか設定します。NULLは、その列にNULL値が1つもない場合にのみ設定可能です。STATISTICSこの構文は、コマンド実行後に行なわれるANALYZE操作において、列単位での統計情報収集対象を設定します。対象として、0から10000までの範囲の値を設定可能です。対象を-1に設定すると、システムのデフォルト統計情報対象(default_statistics_target)が使用されます。PostgreSQLの問い合わせプランナによる統計情報の使用に関する詳細は、項14.2を参照してください。)この構文は属性単位のオプションの設定または設定解除を行います。現時点では属性単位のオプションで定義されているのはn_distinctおよびn_distinct_inheritedのみです。これらのオプションは、その後のANALYZE操作により生成される個別値数の推定値を上書きします。n_distinctはテーブル自身の統計情報に影響を与え、n_distinct_inheritedはテーブルとそれを継承した子テーブルから集めた統計情報に影響を与えます。正の値の場合、ANALYZEは、その列には、正確に指定された非NULLの個別値が存在するものとみなします。負の値の場合、この値は-1以上でなければなりませんが、ANALYZEは、その列内の非NULLの個別値はテーブルのサイズに線形であるとみなし、推定テーブルサイズに指定した値の絶対値を乗じた値が個別値数であるとみなします。-1という値は、列内のすべての値に重複がないことを意味し、-0.5という値は個々の値は平均して2回現れることを意味します。テーブルの行数との乗算は問い合わせ計画を作詞得するまで行われませんので、テーブルサイズが変わり続けるような場合にこれは有用かもしれません。0という値を指定することで、個別値数の推定を通常に戻します。PostgreSQL問い合わせプランナにおける統計情報の使用に関しては項14.2を参照してください。STORAGEこの構文は、列の保管モードを設定します。列をインラインで保持するか補助TOASTテーブルに保持するか、また、データを圧縮するかどうかを制御できます。PLAINは、integerのような固定長の値に対して使用します。インラインで保持され、圧縮されません。MAINは、インラインで保持されていて、圧縮可能なデータに使用します。EXTERNALは圧縮されていない外部データに使用します。EXTENDEDは圧縮された外部データに使用します。EXTENDEDは、PLAIN以外の保管をサポートするほとんどのデータ型におけるデフォルトです。EXTERNALを使用すると、非常に長いtextおよびbytea列に対する部分文字列操作の処理速度が向上しますが、必要な保管容量が増えるというデメリットがあります。STORAGE自体はテーブルをまったく変更しないことに注意してください。以後のテーブルの更新時に遂行する戦略を設定するだけです。詳細は項58.2を参照してください。VALIDオプションを使って新しい制約をテーブルに追加します。VALIDと印付けされた場合、テーブル内のすべての行が制約を満たすかどうかを検証するための、時間がかかるかもしれない初期検査が飛ばされます。制約はその後の挿入や更新に対して強制されます(つまり、外部キー制約の場合、被参照テーブルに一致する行が存在しない限り失敗します。指定された検査制約に一致する新しい行が存在しない限り失敗します)。CONSTRAINTオプションを使用して検証されるまで、テーブル内のすべての行で制約が保持されていると仮定しません。KEYまたはUNIQUE制約を新たに追加します。インデックスのすべての列がこの制約に含まれます。このインデックスには式列や部分インデックスを持つことはできません。これはデフォルトのソート順序を持つB-Treeインデックスでなければなりません。UNIQUEコマンドにより構築されたインデックスと等価であることを確実にします。NULLの実施を試みます。これは列にNULLが含まれないことを検証するために完全なテーブルスキャンを必要とします。この他の場合のすべてにおいて、これが最速の操作です。制約名が提供された場合、インデックスの名前は制約名に合うように変更されます。提供されない場合は制約にはインデックスと同じ名前が付けられます。UNIQUEにより構築された場合と同様に、制約により"所有"されます。この制約を削除するとインデックスも消えてしまいます。既存のインデックスを使用した制約の追加は、長時間のテーブル更新をブロックすることなく新しい制約を追加しなければならない場合に有用になる可能性があります。CONCURRENTLYを用いてインデックスを作成し、この構文を使用して正式の制約としてインストールしてください。後述の例を参照してください。VALIDとして作成された外部キー制約または検査制約を、これらの制約を満たさない行が存在しないことを確認するためにテーブルをスキャンして、検証します。有効であると記録された制約の場合は何も起こりません。EXCLUSIVEロックを獲得します。制約の初期生成時から検証を分離する利点は、より忙しくない時間まで検証を遅延させることができることや、既存のエラーを修正し新しいエラーを防ぐ時間を準備するために使用することができることです。]この構文を使用すると、テーブル上の指定した制約を削除できます。EXISTSが指定された場合、その制約がなくてもエラーになりません。この場合は代わりに注意が出力されます。TRIGGERこの構文を使用すると、テーブルに属するトリガの発行について設定することができます。無効にされたトリガはシステム上に存在し続けますが、トリガイベントが発生したとしても実行されません。確認は、トリガ関数を実際に実行しようとする時ではなく、イベントの発生時に行われます。名前でトリガを1つ指定して有効または無効にすることもできますし、テーブル上のすべてのトリガを指定することもできます。(このオプションは、外部キー制約、遅延可能な一意性および排他制約を実装するために使用される内部向けに生成される制約トリガを除外します。内部向けに生成される制約トリガを有効または無効にするにはスーパーユーザ権限が必要です。トリガが実行されなかった場合に当然ながら制約の整合性が保証されませんので、注意して実行しなければなりません。トリガ発行機構はsession_replication_role設定変数の影響を受けます。有効としたトリガでは、リプリケーションロールが"オリジン"(デフォルト)または"ローカル"の場合に発行されます。REPLICAとしたトリガでは、セッションが"リプリカ"モードである場合のみ発行されます。ALWAYSとしたトリガでは、現在のリプリケーションモードに関係なく発行されます。RULEこの構文を使用すると、テーブルに属する書き換えルールの実行について設定することができます。ルールは無効にしてもシステムに残りますが、問い合わせ書き換え時に適用されません。この意味はトリガの有効化、無効化と同じです。SELECTルールでは無視されます。現在のセッションがデフォルト以外のリプリケーションモードであったとしても、ビュー操作を維持するために常に適用されます。ONこの構文は、以後のCLUSTER操作用のデフォルトインデックスを選択します。実際のテーブルの再クラスタ化は行いません。CLUSTERこの構文は、テーブルから、一番最後に適用されたCLUSTERインデックス指定を削除します。以後のインデックスを指定しないクラスタ操作に影響を及ぼします。OIDSこの構文はoidシステム列をテーブルに追加します(項5.4を参照してください)。テーブルがすでにOIDを持つ場合は何も行いません。oidと同じではないことに注意してください。OIDSこの構文は、テーブルからoidシステム列を削除します。RESTRICTとまったく同等です。)この構文は、1つ以上のテーブルの格納パラメータを変更します。設定可能なパラメータに関しては格納パラメータを参照してください。このコマンドによってテーブルの内容が即座に変更されない点に注意してください。パラメータによりますが、予定の効果を得るためにテーブルを書き換える必要がある場合があります。TABLEの構文のいずれかを使用してください。TABLEではOIDSを格納パラメータとして扱っていません。OIDS構文を使用してください。)この構文は、1つ以上の格納パラメターをデフォルト値に再設定します。SET同様、テーブル全体を更新するためにテーブルの書き換えが必要になる場合があります。parent_tableこの構文は、対象テーブルを指定した親テーブルの子テーブルとして追加します。その後に行われる親テーブルへの問い合わせには対象テーブルの項目も含まれます。子テーブルとして追加するためには、対象テーブルには親テーブルと同じ列がすべて含まれていなければなりません。(この他の列を持つこともできます。NULL制約を持たなければなりません。INHERIT付きで作成された)制約は無視され、これらを除き、親テーブルのCHECK制約すべてについても、一致する制約が子テーブルに存在しなければなりません。一致する子テーブルの制約はすべて継承不可であってはなりません。KEY制約は無視されますが、将来変更されるかもしれません。parent_tableこの構文は、指定した親テーブルから子テーブル群を削除します。親テーブルへの問い合わせでは、対象としたテーブルからのデータが含まれなくなります。OFで形成されたかのように、テーブルと複合型とを関連付けします。テーブルの列名とその型のリストは、複合型のものと正確に一致していなければなりません。oidシステム列の有無は異なっていても構いません。テーブルは他の任意のテーブルを継承していてはいけません。OFがまったく同じテーブル定義を確実に許すことができます。OFこの構文は型から型付けされたテーブルの関連を取り除きます。OWNERこの形式を使用すると、テーブル、シーケンス、またはビューの所有者を、指定したユーザに変更できます。TABLESPACEこの構文を使用すると、テーブルのテーブル空間を指定したテーブル空間に変更し、テーブルに関連するデータファイルを新しいテーブル空間に移動することができます。テーブルにインデックスがあっても移動されません。TABLESPACEコマンドを実行します。TABLESPACEも参照してください。RENAMERENAME構文を使用すると、テーブル(もしくは、インデックス、シーケンス、ビュー)の名前、テーブルの個々の列名、テーブルの制約名を変更できます。格納されているデータへの影響はありません。SCHEMAこの構文を使用して、テーブルを別のスキーマに移動することができます。関連するインデックスや制約、テーブル列により所有されるシーケンスも同様に移動されます。SCHEMA以外の全ての操作は、結合して複数の変更リストにまとめて、並行に処理することができます。複数の列の追加、型の変更を単一のコマンドで実行することができます。これは特に巨大なテーブルでは便利です。変更のために必要なテーブル全体の走査が1回で済むからです。TABLEコマンドを使用するには、変更するテーブルを所有している必要があります。テーブルのスキーマを変更するには、新しいスキーマにおけるCREATE権限も持たなければなりません。親テーブルに新しい子テーブルを追加するには、親テーブルも同様に所有している必要があります。(この制限により強制的に所有者の変更が、テーブルの削除と再作成を行ってもできないことを行わないようにします。スーパーユーザはすべてのテーブルの所有者を変更することができます)。列の追加、列の型の変更、OF句の使用を行うためには、データ型に対するUSAGE権限を持たなければなりません。パラメータname変更対象となる既存のテーブルの名前です(スキーマ修飾名も可)。テーブル名の前にONLYが指定された場合、そのテーブルのみが変更されます。ONLYが指定されていない場合、そのテーブルおよび(もしあれば)そのテーブルを継承する全てのテーブルが更新されます。省略することもできますが、テーブル名の後に*を指定することで、明示的に継承するテーブルも含まれることを示すことができます。column_name新規または既存の列の名前です。new_column_name既存の列の新しい名前です。new_nameテーブルの新しい名前です。type新しい列のデータ型、もしくは既存の列に対する新しいデータ型です。table_constraintテーブルの新しいテーブル制約です。constraint_name削除する既存の制約の名前です。CASCADE削除された列や制約に依存しているオブジェクト(例えば、削除された列を参照しているビューなど)を、自動的に削除します。RESTRICT依存しているオブジェクトがある場合、列または制約の削除要求を拒否します。これがデフォルトの動作です。trigger_name有効または無効にする単一のトリガの名前です。ALLテーブルに属するすべてのトリガを有効または無効にします。(外部キー制約、遅延可能な一意性および排他制約を実装するために使用される、内部向けに生成される制約トリガが含まれる場合、スーパーユーザ権限が必要です。)USER外部キー制約、遅延可能な一意性および排他制約を実装するために使用される、内部向けに生成されるトリガを除く、テーブルに属するトリガすべてを有効または無効にします。index_name指定したインデックス名でテーブルをクラスタ化するように印を付けます。storage_parameterテーブルの格納パラメータの名前です。valueテーブルの格納パラメータの新しい値です。パラメータによりこれは数値となることも文字列となることもあります。parent_tableこのテーブルに関連付ける、または、このテーブルから関連付けを取り除く親テーブルです。new_ownerテーブルの新しい所有者のユーザ名です。new_tablespaceテーブルを移動する先のテーブル空間の名前です。new_schemaテーブルを移動する先のスキーマの名前です。注釈COLUMNキーワードはノイズであり、省略可能です。COLUMNによって列を追加した時、テーブル内の既存行に追加された列は、全てデフォルト値(DEFAULTが指定されていない場合はNULL)で初期化されます。NULLではないデフォルト値を持つ列を追加したり、既存の列の型を変更するには、テーブルとインデックス全体の書き換えが必要になります。例外として、USING句が列の内容を変更せず、かつ、古いデータ型が新しい型とバイナリ変換可能であるか新しい型全体に対する制約のないドメインである場合、テーブルの書き換えは必要ありません。影響を受ける列に対するインデックスはすべて再構築されなければなりません。システムoid列の追加や削除も同様にテーブル全体の書き換えが必要です。テーブルが巨大な場合、テーブル、インデックスまたはその両方の再構築に非常に時間がかかる可能性があります。一時的に2倍のディスク容量が必要とされます。NULL制約を追加する時は、既存の行が制約に従うかどうかを検証するためにテーブルの走査が必要になります。TABLE内に複数の変更を指定できるオプションを提供する主な理由は、複数のテーブル走査や書き換えを1回のテーブル走査にまとめることができるようにすることです。COLUMN構文は、列を物理的には削除せず、SQLを操作する上で不可視にします。このコマンドを実行した後、テーブルに挿入または更新が行われると、削除した列にはNULLが格納されます。したがって、列の削除は短時間で行えます。削除された列が占めていた領域がまだ回収されていないため、テーブルのディスク上のサイズはすぐには小さくなりません。この領域は、その後既存の行が更新されるタイミングで回収されます。(システムoid列を削除する場合はこれらの文は適用されません。これは即座の書き換えが行われます。TABLE構文を使用することができます。これにより、見た目にはテーブルに有意な変更はありませんが、使用されなくなったデータが取り除かれます。TYPEのUSINGオプションでは、その行の古い値を含め、どのような式でも指定できます。変換対象の列と同様に、その他の列も参照することができます。TYPE構文で行うことができます。この柔軟性のため、USING式は列のデフォルト値には(仮に存在していても)適用されません。結果が定数式にならない可能性があるためです(デフォルト値は定数式でなければいけません)。TYPEがデフォルト値の変換に失敗する可能性があります。DEFAULTを使用して再度適切なデフォルト値を指定してください。変更対象の列を持つインデックスと制約も同様の配慮が必要です。そのテーブルを継承するテーブルがある場合、子テーブルに同じ処理を実行しなければ、親テーブルに対する列の追加、列の名前、列の型、継承された制約の名前の変更を実行することはできません。ONLYコマンドは受け付けられません。この制限により、子テーブルの列が常に親テーブルと一致していることが保証されます。COLUMN操作では、子テーブルが他の親テーブルからその列を継承しておらず、かつ、独立した列定義を持っていない場合のみ、その子テーブルの列を削除します。COLUMNなど)操作では、継承された列は削除されません。削除する代わりに、その列は継承されておらず独立して定義されているという印を付けます。TRIGGER、CLUSTER、OWNERおよびTABLESPACEは子テーブルに再帰的に伝わりません。常にONLYが指定されているかのように動作します。INHERIT印がないCHECK制約に関してのみ再帰的に伝わります。システムカタログテーブルについては、いかなる部分の変更も許可されていません。TABLEを参照してください。第5章に、継承に関するさらに詳しい情報があります。例varchar型の列をテーブルに追加します。varchar(30);テーブルから列を削除します。RESTRICT;1つの操作で既存の2つの列の型を変更します。zoneに変更します。second';上と同じです。その列は、自動的に新しいデータ型にキャストされないデフォルト式を持ちます。now();既存の列の名前を変更します。city;既存のテーブルの名前を変更します。suppliers;既存の制約の名前を変更します。zip_check;列に非NULL制約を付与します。NULL;列から非NULL制約を削除します。NULL;テーブルとその子テーブルすべてにCHECK制約を付与します。5);そのテーブルのみに適用され、その子テーブルには適用されない検査制約を追加します。INHERIT;(検査制約はこの後作成される子テーブルにも継承されません。)テーブルとその子テーブルからCHECK制約を削除します。zipchk;1つのテーブルのみから検査制約を削除します。zipchk;(この検査制約はすべての子テーブルで残ったままです。)テーブルに外部キー制約を付与します。(address);テーブルに(複数列の)一意性制約を付与します。zipcode);自動的に命名されるプライマリキー制約をテーブルに付与します。1つのテーブルが持てるプライマリキーは1つだけであることに注意してください。(dist_id);テーブルを別のテーブル空間に移動します。fasttablespace;テーブルを別のスキーマに移動します。yourschema;インデックスを再構築している間の更新をブロックすることなく、プライマリキー制約を再作成します。TYPE(USINGがない)構文は標準SQLに従います。他の構文は標準SQLに対するPostgreSQLの拡張です。TABLEコマンド内に複数の操作を指定する機能もPostgreSQLの拡張です。COLUMNを使って、1つしか列がないテーブルから列を削除して、列がないテーブルを作成することができます。これはPostgreSQLの拡張です。SQLでは、列を持たないテーブルは認められていません。TABLESPACE。