このトピックでは、ALTER TABLEステートメントについて説明します。
概要
ALTER TABLE文を使用して、既存のテーブルの定義を変更できます。 次のセクションでは、ALTER TABLEステートメントで使用できる句について説明します。 句に必要なロックレベルは異なる場合があることに注意してください。 ACCESS EXCLUSIVEロックは、明示的に指定されない限り適用されます。 ALTER TABLEステートメントで複数の句を使用する場合、句に必要な最も厳しいロックが適用されます。
ADD COLUMN [ IF NOT EXISTS ]: 新しい列をテーブルに追加します。 この句は、CREATE TABLEステートメントと同じ構文を使用します。 ステートメントでIf NOT EXISTSオプションを指定し、指定した名前の列が既に存在する場合、エラーはスローされません。
DROP COLUMN [ IF EXISTS ]: テーブルから列を削除します。 削除された列に依存または関連付けられているインデックスとテーブル制約は自動的に削除されます。 削除された列を参照する多変量統計も、列の削除によって統計に1つの列のみのデータが含まれる場合に削除されます。 外部キー参照やビューなど、テーブル外の他のオブジェクトが列に依存する場合は、CASCADEキーワードを追加する必要があります。 ステートメントでIf EXISTSオプションを指定し、指定した列が存在しない場合、エラーはスローされませんが、メッセージ通知が表示されます。
SET DATA TYPE: テーブル内の列のデータ型を変更します。 列に依存または関連付けられているインデックスと単純なテーブル制約は、最初に指定された式を再解析することにより、新しい列データ型を使用するように自動的に変換されます。 オプションのCOLLATE句は、新しい列データ型の照合順序を指定します。 照合順序を指定しない場合、新しい列データ型には既定の照合順序が使用されます。 USING句は、列データを現在のデータ型から新しいデータ型に変換する方法を指定します。 USING句を指定しない場合、現在のデータ型から新しいデータ型にデータを変換するために使用される既定の割り当てキャストルールが適用されます。 現在のデータ型から新しいデータ型にデータを変換するための暗黙的または割り当てキャストルールがない場合は、USING句を使用する必要があります。
SET /DROP DEFAULT: 列のデフォルト値を設定または削除します。 列のデフォルト値を削除するには、DROP default句を使用するか、デフォルト値をNULLに設定します。 新しいデフォルト値は、後続のINSERTまたはUPDATEステートメントでのみ有効になり、テーブル内の既存の行は変更されません。
SET /DROP NOT NULL: 列からNOT NULL制約を追加または削除します。
列の行にNULL値がない場合にのみ、列に対してSET NOT NULL操作を実行できます。 ほとんどの場合、これはALTER tableステートメントを実行するときにテーブル全体に対してチェックされます。 ただし、列のいずれの値もNULLにできないことを論理的に保証する有効なCHECK制約がテーブルに存在する場合、テーブル全体のスキャンはスキップされます。
テーブルがパーティションの場合、親テーブルの列にNOT NULL制約が追加されている場合、列に対してDROP NOT NULL操作を実行できません。 パーティションからNOT NULL制約を削除するには、親テーブルに対してDROP NOT NULL操作を実行します。 NOT NULL制約は、親テーブルに制約が存在しない場合でも、個々のパーティションに追加できます。 親テーブルがnull値を許可している場合でも、子テーブルはnull値を許可しません。
DROP EXPRESSION [ IF EXISTS ]: 格納された生成列を通常のベース列に変換します。 列内の既存のデータは保持されますが、世代式は今後の変更には適用されません。
DROP EXPRESSION If EXISTS句を使用し、列が格納された生成列でない場合、エラーはスローされませんが、メッセージ通知が表示されます。
[GENERATED { ALWAYS | BY DEFAULT} をIDENTITYとして追加]: 既存のテーブルに新しいID列を追加します。 SET GENERATED { ALWAYS | BY DEFAULT }: 既存のID列のgeneration属性を変更します。 DROP IDENTITY [ IF EXISTS ]: 列からIDプロパティを削除します。 詳細については、CREATE TABLEのドキュメントを参照してください。 上記の句は、SET DEFAULT句と同様に、後続のINSERTおよびUPDATEステートメントの動作にのみ影響します。 上記の句では、テーブル内の既存の行は変更されません。
ステートメントでDROP IDENTITY If EXISTS句を使用し、列がID列でない場合、エラーは発生しませんが、メッセージ通知が表示されます。
SET sequence_option RESTART: 既存のID列の下にあるシーケンスを変更します。 sequence_optionは、INCREMENT BYなどのALTER sequenceステートメントでサポートされるオプションです。
SET STATISTICS: 後続のANALYZE操作の列ごとの統計収集ターゲットを設定します。 ターゲットは0 ~ 10,000の範囲の値に設定できます。 または、ターゲットを-1に設定して、システムのデフォルト統計ターゲット (default_statistics_target) を使用することもできます。
SET STATISTICS句には、SHARE UPDATE EXCLUSIVEロックが必要です。
SET (attribute_option=value [, ... ] ) RESET (attribute_option [, ... ] ): 属性ごとのオプションを設定またはリセットします。 定義されている属性ごとのオプションは、n_distinctとn_distinct_inheritedのみです。これらは、後続のANALYZE操作によって行われた異なる値の推定をオーバーライドします。 n_distinctオプションは、テーブル自体に関する統計に影響します。 n_distinct_inheritedオプションは、テーブルとその子テーブルに対して収集された統計に影響します。 オプションを正の値に設定した場合、ANALYZEは、列に指定された数の異なるnull以外の値が含まれていると仮定します。 オプションを負の値 (-1以上である必要があります) に設定した場合、ANALYZEは、列内の異なるnull以外の値の数がテーブルのサイズと線形関係にあると仮定します。 明確な非ヌル値の正確なカウントは、テーブルの推定サイズに指定された負の数の絶対値を掛けることによって計算されます。 たとえば、-1の値は、列内のすべての値が異なることを示します。 -0.5の値は、各値が平均で2回現れることを示します。 これは、テーブルのサイズが時間とともに変化する場合に便利です。テーブルの行数による乗算は、クエリの計画中にのみ実行されるためです。 null以外の異なる値の数に通常の推定方法を使用するには、値0を指定します。
属性ごとのオプションを変更するには、SHARE UPDATE EXCLUSIVEロックが必要です。
SET STORAGE: 列のストレージモードを設定します。 この句は、列をインラインまたはセカンダリTOASTテーブルに保持するかどうか、およびデータを圧縮するかどうかを決定します。 PLAINストレージモードは、integerなどの固定長タイプ用に設計されています。 このモードでは、データは圧縮なしで主行構造内に記憶される。 メインストレージモードは、メイン行構造内にデータを格納し、圧縮を可能にします。 EXTERNALストレージモードは、データを圧縮せずにメイン行構造の外に格納します。 EXTENDEDストレージモードは、メインテーブル構造の外部にデータを格納し、ストレージ使用量を減らすためにデータ圧縮を提供します。 EXTENDEDストレージモードは、PLAIN以外のストレージをサポートするほとんどのデータ型のデフォルトのストレージモードです。 大きなtextおよびbytea値に対する部分文字列演算のパフォーマンスを向上させるには、EXTERNALストレージモードを指定します。 しかし、このモードは、ストレージスペースの増加につながる可能性があります。 SET STORAGE句は、将来のテーブル更新のためにストレージモードを構成し、既存のデータを変更しないことに注意してください。
ADD table_constraint [ NOT VALID ]: 新しい制約をテーブルに追加します。 構文は、CREATE TABLEステートメントで制約を定義する方法に従いますが、追加のNOT VALIDオプションがあります。 NOT VALIDオプションは、外部キーとCHECK制約に対してのみ使用できます。
ほとんどの場合、この句はテーブルをスキャンして、テーブル内の既存のすべての行が新しい制約を満たしていることを確認します。 NOT VALIDオプションを指定した場合、時間がかかる可能性のあるスキャンはスキップされます。 追加された制約は、後続のINSERTおよびUPDATEステートメントに対して適用されます。 外部キー制約を追加した場合、参照テーブルに一致する行が存在する場合にのみ操作が成功します。 CHECK制約を追加すると、新しい行が指定されたチェック条件と一致する場合にのみ操作が成功します。 データベースは、VALIDATE constraintオプションを使用して制約が検証されるまで、テーブル内のすべての行に制約が適用されることを前提としません。
ADD table_constraint句のほとんどの形式にはACCESS EXCLUSIVEロックが必要ですが、ADD FOREIGN KEY句にはSHARE ROW EXCLUSIVEロックのみが必要です。 ADD FOREIGN KEY句は、制約が追加されたテーブルのロックに加えて、参照先テーブルのSHARE ROW EXCLUSIVEロックも取得することに注意してください。
パーティションテーブルに一意または主キー制約を追加する場合は、追加の制限が適用されます。 詳細については、CREATE TABLEのドキュメントを参照してください。 パーティションテーブルの外部キー制約は、not VALIDとして宣言されない場合があります。
ADD table_constraint_using_index: 既存の一意のインデックスに基づいて、新しいPRIMARY KEYまたはUNIQUE制約をテーブルに追加します。 インデックスのすべての列が制約に含まれます。
インデックスに式列を含めることも、部分インデックスにすることもできません。 インデックスは、デフォルトのソート順序を持つBツリーインデックスである必要があります。 上記の制限により、インデックスは通常のADD PRIMARY KEYまたはADD UNIQUE句によって作成されたものと同等になります。
PRIMARY KEY制約を追加し、インデックスの列がnot NULLとしてマークされていない場合、ステートメントは各列に対してALTER COLUMN SET NOT NULL操作を実行しようとします。 この操作では、列にnull値が含まれていないことを確認するためにテーブル全体のスキャンが必要です。 他のすべての場合、操作は完了するまでに短い時間を必要とします。
制約名を指定すると、指定された制約名に一致するようにインデックスの名前が変更されます。 それ以外の場合、制約はインデックスと同じ名前を使用します。
このステートメントを実行すると、インデックスは制約によって「所有」されます。これは、通常のADD PRIMARY KEY句またはADD UNIQUE句を使用してインデックスを作成した場合にも発生します。 この場合、制約を削除するとインデックスは消えます。
パーティションテーブルではこの句を使用できません。
構文
ALTER TABLE [ IF EXISTS ] [ ONLY ] name [ *]
action [, ... ]
ALTER TABLE [ IF EXISTS ] [ ONLY ] name [ *]
RENAME [ COLUMN ] column_nameへnew_column_name
ALTER TABLE [ IF EXISTS ] [ ONLY ] name [ *]
RENAME CONSTRAINT constraint_nameにnew_constraint_name
ALTER TABLE [ IF EXISTS] 名
RENAME TO new_name
ALTER TABLE [ IF EXISTS] 名
SET SCHEMA new_schema
ALTER TABLE ALL IN TABLESPACE name [ OWNED BY role_name [, ... ] ]]
SET TABLESPACE new_tablespace [ NOWAIT]
ALTER TABLE [ IF EXISTS] 名
ATTACH PARTITION partition_name { FOR VALUES partition_bound_spec | デフォルト}
ALTER TABLE [ IF EXISTS] 名
DETACH PARTITION partition_name
アクション:
ADD [ COLUMN ] [存在しない場合] column_name data_type [ COLLATE collation ] [ column_constraint [ ... ] ]
DROP [ COLUMN ] [ IF EXISTS ] column_name [ RESTRICT | CASCADE]
ALTER [ COLUMN ] column_name [ SET DATA ] TYPE data_type [ COLLATE collation ] [ USING expression]
ALTER [ COLUMN ] column_name SET DEFAULT式
ALTER [ COLUMN ] column_name DROP DEFAULT
ALTER [ COLUMN ] column_name { SET | DROP } NOT NULL
ALTER [ COLUMN ] column_nameドロップ表現 [IF EXISTS]
ALTER [ COLUMN ] column_name ADD GENERATED {常に | デフォルト} をIDENTITY [ ( sequence_options ) ] として
ALTER [ COLUMN ] column_name { SET GENERATED { ALWAYS | BY DEFAULT } | SET sequence_option | RESTART [ [ WITH ] restart ] } [...]
ALTER [ COLUMN ] column_nameドロップID [存在する場合]
ALTER [ COLUMN ] column_name SET STATISTICS整数
ALTER [ COLUMN ] column_name SET ( attribute_option = value [, ... ] )
ALTER [ COLUMN ] column_name RESET ( attribute_option [, ... ] )
ALTER [ COLUMN ] column_name SET STORAGE { PLAIN | 外部 | 拡張 | メイン}
ADD table_constraint [ NOT VALID]
ADD table_constraint_using_index
ALTER CONSTRAINT constraint_name [最低 | 最低ではない] [初期に定義された | 初期に即時]
VALIDATE CONSTRAINT constraint_name
DROP CONSTRAINT [ IF EXISTS ] constraint_name [ RESTRICT | CASCADE]
DISABLE TRIGGER [ trigger_name | ALL | ユーザー]
ENABLE TRIGGER [ trigger_name | ALL | ユーザー]
ENABLE REPLICA TRIGGER trigger_name
常にトリガーを有効にするtrigger_name
DISABLE RULE rewrite_rule_name
ENABLE RULE rewrite_rule_name
ENABLE REPLICAルールrewrite_rule_name
常にルールを有効にするrewrite_rule_name
DISABLE ROWレベルセキュリティ
有効な行レベルセキュリティ
FORCE ROWレベルセキュリティ
FORCE ROWレベルセキュリティなし
index_nameのクラスター
クラスターなしで設定
子供なしでセット
SET TABLESPACE new_tablespace
SET {ログイン済み | 未ログイン}
SET ( storage_parameter [= value] [, ... ] )
RESET ( storage_parameter [, ... ] )
INHERIT parent_table
NO INHERIT parent_table
のタイプ名
いいえの
{new_owner | CURRENT_USER | SESSION_USER} への所有者
REPLICA IDENTITY {デフォルト | USING INDEX index_name | FULL | NOTHING}
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)
column_constraint:
[ CONSTRAINT constraint_name ]
{ NOT NULL |
NULL |
チェック (式) [相続人なし] |
DEFAULT default_expr |
常に (generation_expr ) STOREDとして生成 |
GENERATED {常に | デフォルト} をIDENTITY [ ( sequence_options ) ] として |
UNIQUE index_parameters |
PRIMARYキーindex_parameters |
REFERENCES reftable [ ( refcolumn ) ] [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE]
[削除中referential_action ] [更新中referential_action ] }
[卑劣な | 卑劣ではない] [初期的に卑劣な | 初期的に即時]
table_constraint:
[ CONSTRAINT constraint_name ]
{チェック (式) [相続人なし] |
UNIQUE ( column_name [, ... ] ) index_parameters |
PRIMARY KEY ( column_name [, ... ] ) index_parameters |
EXCLUDE [ USING index_method ] ( exclude_element WITH演算子 [, ... ] ) index_parameters [ WHERE (述語) ] |
FOREIGN KEY ( column_name [, ... ] ) REFERENCES reftable [ ( refcolumn [, ... ] ) ]
[MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ] [ ON DELETE action ] [ ON UPDATE action ] }
[卑劣な | 卑劣ではない] [初期的に卑劣な | 初期的に即時]
table_constraint_using_index:
[ CONSTRAINT constraint_name ]
インデックスindex_nameを使用して {UNIQUE | PRIMARY KEY}
[卑劣な | 卑劣ではない] [初期的に卑劣な | 初期的に即時]
UNIQUE、PRIMARY KEY、EXCLUDE制約のindex_parameters:
[含まれる (column_name [, ... ] ) ]
[WITH ( storage_parameter [= value] [, ... ] ) ]
[インデックスTABLESPACE tablespace_nameを使用]
EXCLUDE制約内のexclude_element:
{column_name | ( expression ) } [ opclass ] [ ASC | DESC ] [ NULLS { FIRST | LAST } ] 新しい制約を追加したいが、長期間テーブルの更新をブロックしたくない場合は、既存のインデックスを使用して制約を追加できます。 既存のインデックスを使用して制約を追加するには、create index CONCURRENTLYステートメントを使用してインデックスを作成し、次の構文を使用して制約を公式制約として適用または適用します。 次の例を参照してください。
ALTER CONSTRAINT: 以前に作成した制約の属性を変更します。 外部キー制約のみを変更することができる。
VALIDATE CONSTRAINT: NOT VALIDオプションが指定されている外部キーまたはチェック制約を検証します。テーブルをスキャンして、制約が満たされない行が存在しないことを確認します。 制約がすでに有効としてマークされている場合、この操作は有効になりません。
DROP CONSTRAINT [ IF EXISTS ]: 制約の基礎となるインデックスとともにテーブルから制約を削除します。 If EXISTSオプションを指定し、制約が存在しない場合、エラーはスローされませんが、メッセージ通知が表示されます。
DISABLE /ENABLE [ REPLICA | ALWAYS ] TRIGGER: テーブルに属するトリガーを有効または無効にします。 無効化されたトリガは、依然としてシステムに知られているが、対応するトリガイベントが発生したときには実行されない。 遅延トリガーの場合、トリガー機能が実際に実行されたときではなく、対応するトリガーイベントが発生したときにステータスがチェックされます。 単一のトリガー (名前を指定する) 、テーブル上のすべてのトリガー、またはユーザートリガーのみを無効または有効にできます。 ユーザートリガオプションは、外部キー制約または延期可能な一意性および除外制約を実装するために使用されるものなど、内部で生成された制約トリガを除外します。 内部で生成された制約トリガーを無効または有効にするには、スーパーユーザー権限が必要です。 トリガが実行されない場合、制約の完全性は保証されない。
トリガー起動メカニズムは、設定変数session_replication_roleの影響も受けます。 レプリケーションロールが "origin" (デフォルト) または "local" の場合、単純に有効なトリガーが起動されます。 ENABLE REPLICAとして設定されたトリガーは、セッションが「レプリカ」モードの場合にのみ発生し、ENABLE ALWAYSとして設定されたトリガーは、現在のレプリケーションロールに関係なく発生します。
その結果、トリガーはレプリカで自動的に起動されません。 オリジンでトリガーを使用してテーブル間でデータを伝播する場合、レプリケーションシステムは伝播されたデータも複製します。 この場合、複製を防ぐために、レプリカでトリガーを2回起動してはなりません。 ただし、外部アラートの作成など、別の目的でトリガーを使用する場合は、トリガーを常にENABLEに設定する必要があります。 このようにして、トリガーはレプリカで起動されます。
この操作を実行すると、SHARE ROW EXCLUSIVEロックが適用されます。
DISABLE /ENABLE [ REPLICA | ALWAYS ] RULE: テーブルの書き換えルールを有効または無効にします。 無効な書き換えルールはシステムにはまだ認識されていますが、クエリの書き換え中にルールは適用されません。 セマンティクスは、無効化または有効化されたトリガーのセマンティクスと同じです。 この設定は、ON SELECTルールでは無視されます。このルールは、現在のセッションがデフォルト以外のレプリケーションロールにある場合でも、常にビューを機能させるために適用されます。
ルールの実行メカニズムは、前のセクションで説明したトリガーと同様に、session_replication_role構成変数の影響も受けます。
DISABLE /ENABLE ROW LEVEL SECURITY: テーブルの行セキュリティポリシーを有効または無効にします。 行セキュリティポリシーを有効にし、テーブルにポリシーが存在しない場合、default-denyポリシーが適用されます。 行レベルのセキュリティポリシーを無効にした場合でも、テーブルにポリシーが存在する可能性があることに注意してください。 この場合、ポリシーは適用されず、ポリシーは無視される。
NOFORCE /FORCE ROW LEVEL SECURITY: ユーザーがテーブルの所有者である場合、テーブルの行セキュリティポリシーを有効または無効にします。 行セキュリティポリシーを有効にすると、ユーザーがテーブルの所有者である場合、行レベルのセキュリティポリシーが適用されます。 ポリシーが無効 (デフォルト) の場合、ユーザーがテーブルの所有者である場合、行レベルのセキュリティポリシーは適用されません。
CLUSTER ON: 今後のCLUSTER操作のデフォルトインデックスを選択します。 この句は、実際にはテーブルを再クラスタ化しません。
クラスターオプションを変更すると、SHARE UPDATE EXCLUSIVEロックが適用されます。
SET WITHOUT CLUSTER: 最近使用したCLUSTERインデックス仕様をテーブルから削除します。 この句は、インデックスを指定しない将来のクラスター操作には影響しません。
クラスターオプションを変更すると、SHARE UPDATE EXCLUSIVEロックが適用されます。
SET WITHOUT OIDS: oidシステム列を削除するための下位互換構文です。 oid列を追加できなくなったため、この句は有効になりません。
SET TABLESPACE: テーブルのテーブルスペースを指定されたテーブルスペースに変更し、テーブルに関連付けられているデータファイルを指定されたテーブルスペースに移動します。 テーブルのインデックスは移動されませんが、追加のSET TABLESPACEステートメントを使用してインデックスを個別に移動できます。 この句は、パーティションテーブルでは有効になりません。 ただし、その後CREATE TABLE PARTITION OFを使用して作成されたパーティションは、tablespace句でオーバーライドされない限り、指定されたテーブルスペースを使用します。
現在のデータベース内のすべてのテーブルをテーブルスペースに移動するには、all in tablespace句を使用します。 [OWNED BY] オプションを指定した場合、指定したロールが所有するテーブルのみが移動されます。 NOWAITオプションを指定した場合、必要なすべてのロックをすぐに取得できないと、ステートメントは失敗します。 この句はシステムカタログを移動しないことに注意してください。 システムカタログを移動するには、ALTER DATABASEまたは明示的なALTER TABLE呼び出しを使用します。 information_schemaリレーションはシステムカタログの一部とは見なされず、移動されます。
SET { LOGGED | UNLOGGED }: テーブルを未ログからログに、またはその逆に変更します (unloggedを参照) 。 この句は一時テーブルでは使用できません。
現在のアーキテクチャはUNLOGGED TABLEをサポートしていません。 その結果、SET UNLOGGED句を使用するとエラーが発生します。
SET (storage_parameter [= value] [, ... ] ): テーブルの1つ以上のストレージパラメータを変更します。 使用可能なパラメーターについては、CREATE TABLEドキュメントの「ストレージパラメーター」セクションを参照してください。 この句は、テーブルの書き換えに使用するパラメーターによっては、テーブルの内容をすぐには変更しない場合があります。 強制的なテーブルの書き換えを実行するには、VACUUM FULLまたはCLUSTERステートメント、またはALTER tableステートメントのいずれかの句を使用します。 プランナー関連のパラメーターの場合、変更は次回テーブルがロックされたときに有効になります。 このように、実行されているクエリは影響を受けません。
SHARE UPDATE EXCLUSIVEロックは、fillfactor、toast、autovacuumストレージパラメーター、およびparallel_workersプランナーパラメーターに使用されます。
RESET (storage_parameter [, ... ] ): 1つ以上のストレージパラメータをデフォルト値にリセットします。 SET句と同様に、テーブルを完全に更新するにはテーブルの書き換えが必要になる場合があります。
INHERIT parent_table: 指定された親テーブルの新しい子テーブルとしてテーブルを追加します。 次に、親テーブルのクエリには、子テーブルのレコードが含まれます。 テーブルを子テーブルとして追加するには、テーブルに親テーブルと同じ列が含まれていることを確認します。 子テーブルは追加の列を持つことができます。 列は一致するデータ型を使用する必要があります。 親テーブルにNOT NULL制約がある列の場合、子テーブルにもNOT NULL制約がある必要があります。
非継承 (ALTER table...) としてマークされたものを除く、親テーブルのすべてのがない場合、子テーブルには一致する制約が必要です。 一致したすべての子テーブル制約は、非継承としてマークされてはなりません。 この句は、ステートメントのCHECK制約について 制約を追加... 親テーブルでINHERITUNIQUE、PRIMARY KEY、およびFOREIGN KEY制約を考慮または影響しません。
NO INHERIT parent_table: 指定された親テーブルの子テーブルのリストからテーブルを削除します。 この場合、親テーブルのクエリには子テーブルのレコードは含まれなくなります。
OF type_name: CREATE table OFステートメントと同様に、テーブルを複合型に関連付けます。 列とそのデータ型は、複合型で定義されている列とデータ型と完全に一致する必要があります。 テーブルは他のテーブルから継承してはなりません。 上記の制限により、CREATE TABLE OFステートメントで同等のテーブル定義が許可されます。
NOT OF: 型指定されたテーブルをその型から分離します。
所有者: テーブル、シーケンス、ビュー、マテリアライズドビュー、または外部テーブルの所有者を指定されたユーザーに変更します。
REPLICA IDENTITY: 先行書き込みログに書き込まれる情報を変更して、更新または削除された行を識別します。 論理レプリケーションを使用する場合を除き、このオプションは有効になりません。 DEFAULT: 主キーの列の以前の値を記録します。 これは、非システムテーブルのデフォルトオプションです。 USING INDEX: 名前付きインデックスの対象となる列の前の値を記録します。 インデックスは一意で、部分的ではなく、延期できず、not NULL制約が追加された列のみを含む必要があります。 FULL: 行のすべての列の以前の値を記録します。 NOTHING: 古い行に関する情報は記録されません。 これは、システムテーブルのデフォルトオプションです。 すべての場合において、以前の値を記録することができる列のうちの少なくとも1つが、古い行バージョンと新しい行バージョンとの間で変更された場合を除いて、以前の値は記録されない。
RENAME: テーブル (またはインデックス、シーケンス、ビュー、マテリアライズドビュー、または外部テーブル) の名前、テーブル内の個々の列の名前、またはテーブルの制約の名前を変更します。 基になるインデックスを持つ制約の名前を変更すると、インデックスも名前が変更されます。 この句は、格納されたデータには適用されません。
SET SCHEMA: テーブルを別のスキーマに移動します。 テーブル列によって所有される関連するインデックス、制約、およびシーケンスも移動されます。
ATTACH PARTITION partition_name { FOR VALUES partition_bound_spec | DEFAULT }: 分割可能な既存のテーブルを宛先テーブルのパーティションとしてアタッチします。 for valuesオプションを使用して特定の値のパーティションとして、またはdefaultオプションを使用してデフォルトパーティションとしてテーブルをアタッチできます。 この句は、宛先テーブルのインデックスごとに、添付テーブルに対応するインデックスを作成します。 同等のインデックスがすでに存在する場合は、ALTER index ATTACH PARTITIONステートメントが実行されたかのように、ターゲットテーブルのインデックスにアタッチされます。 既存のテーブルが外部テーブルであり、UNIQUEインデックスが宛先テーブルに存在する場合、既存のテーブルを宛先テーブルのパーティションとしてアタッチすることはできません。 この句は、ターゲットテーブルに存在するユーザー定義の行レベルトリガーごとに、添付テーブルに対応するトリガーを作成します。
FOR VALUESオプションを使用するパーティションは、CREATE TABLEステートメントと同じpartition_bound_spec構文を使用します。 パーティション・バインドの仕様は、宛先テーブルのパーティショニング戦略とパーティション・キーに対応している必要があります。 アタッチするテーブルには、ターゲットテーブルと同じ列が必要です。 さらに、列のデータ型も一致する必要があります。 既存のテーブルには、宛先テーブルのすべてのNOT NULLおよびCHECK制約が必要です。 この句は、FOREIGN KEY制約を考慮または影響しません。 親テーブルのUNIQUEおよびPRIMARY KEY制約がパーティションに存在しない場合、制約はパーティションに作成されます。 アタッチされているテーブルのCHECK制約の1つがNO INHERITとしてマークされている場合、操作は失敗します。 NO INHERIT句なしで制約を再作成する必要があります。
新しいパーティションが通常のテーブルである場合、テーブル全体のスキャンを実行して、テーブル内の既存の行がパーティションの制約に違反していないことを確認します。 文を実行する前にパーティション制約を満たす行のみを許可する有効なCHECK制約をテーブルに追加することで、スキャンを回避できます。 CHECK制約は、パーティション制約を検証するためにテーブル全体のスキャンが必要ないことを保証します。 ただし、パーティションキーが式であり、パーティションがNULL値を受け入れない場合、CHECK制約は有効になりません。 NULL値を受け入れないリストパーティションをアタッチする場合は、パーティションキー列にnot NULL制約を追加します。 式の場合は、上記の操作を実行する必要はありません。
新しいパーティションが外部テーブルの場合、外部テーブルのすべての行がパーティションの制約に準拠していることを確認する必要はありません。
テーブルにデフォルトパーティションがある場合、新しいパーティションを定義すると、デフォルトパーティションのパーティション制約が変更されます。 デフォルトのパーティションには、新しいパーティションに移動する必要のある行を含めることはできません。また、前の行が存在しないことを確認するためにスキャンされます。 適切なCHECK制約を追加することで、スキャンを回避できます。 デフォルトのパーティションが外部テーブルの場合、スキャンはスキップされます。
親テーブルにパーティションを追加すると、親テーブルにSHARE UPDATE EXCLUSIVEロックが適用され、アタッチされているテーブルとデフォルトパーティションにACCESS EXCLUSIVEロックが適用されます。
DETACH PARTITION partition_name: ターゲットテーブルの指定されたパーティションをデタッチします。 デタッチされたパーティションは、スタンドアロンテーブルとして存在し続けますが、デタッチされたテーブルとは関係がありません。 ターゲットテーブルのインデックスにアタッチされているインデックスはすべてデタッチされます。 ターゲットテーブルのトリガーのクローンとして作成されたトリガーはすべて削除されます。
RENAME、SET SCHEMA、ATTACH PARTITION、およびDETACH PARTITIONを除く、単一のテーブルに作用するALTER TABLEステートメントのすべての句を組み合わせて、複数の交代のリストにまとめて適用できます。 たとえば、1つのステートメントで複数の列を追加したり、複数の列のタイプを変更したりできます。 これは、テーブルを1回通過するだけでよいので、大きなテーブルを管理する際に有用である。
ALTER tableを使用するには、テーブルを所有する必要があります。 テーブルのスキーマまたはテーブルスペースを変更するには、新しいスキーマまたはテーブルスペースに対するCREATEアクセス許可が必要です。 親テーブルの新しい子テーブルとしてテーブルを追加するには、親テーブルを所有している必要があります。 テーブルをテーブルの新しいパーティションとしてアタッチするには、アタッチするテーブルを所有している必要があります。 所有者を変更するには、所有権を譲渡するロールのIDと権限を引き受けるために必要な権限が必要です。 新しいロールには、テーブルのスキーマに対するCREATE権限が必要です。 これらの制限により、テーブルの所有者を変更しても、テーブルを削除して再作成しても新しい機能は得られません。 スーパーユーザーのみが任意のテーブルの所有権を変更できます。 列の追加、列の種類の変更、またはOF句の使用には、データ型に対するUSAGE権限も必要です。
Parameters
IF EXISTS: 指定されたテーブルが存在しない場合、エラーはスローされません。 代わりにメッセージ通知が表示されます。
name: 変更する既存のテーブルの名前。 名前はスキーマで修飾できます。 テーブルの名前の前にのみを指定した場合、テーブルのみが変更されます。 テーブルの名前の前にのみを指定しない場合、テーブルとそのすべての子テーブル (存在する場合) が変更されます。 テーブル名の後に * を指定して、子テーブルが含まれていることを明示的に示すことができます。
column_name: 新規または既存の列の名前。
new_column_name: 既存の列の新しい名前。
new_name: テーブルの新しい名前。
data_type: 新しい列のデータ型、または既存の列の新しいデータ型。
table_constraint: テーブルの新しいテーブル制約です。
constraint_name: 新規または既存の制約の名前。
CASCADE: 削除された列または制約に依存するオブジェクト (列を参照するビューなど) を自動的に削除します。 削除されたオブジェクトに依存するすべてのオブジェクトも削除されます。
RESTRICT: オブジェクトが依存する列または制約は削除されません。 デフォルト設定です。
trigger_name: 無効化または有効化する1つのトリガーの名前。
ALL: テーブルに属するすべてのトリガーを無効または有効にします。 トリガーのいずれかが、外部キーの制約を実装するために使用されるトリガーや、延期可能な一意性と除外の制約など、内部で生成された制約トリガーである場合、スーパーユーザー権限が必要です。
USER: 外部キー制約や延期可能な一意性および除外制約の実装に使用されるトリガーなど、内部で生成された制約トリガーを除く、テーブルに属するすべてのトリガーを無効または有効にします。
index_name: 既存のインデックスの名前。
storage_parameter: テーブルストレージパラメーターの名前。
value: テーブルストレージパラメータの新しい値。 値はパラメーターによって異なり、数値または文字列にすることができます。
parent_table: テーブルに関連付けたり、関連付けを解除したりする親テーブル。
new_owner: テーブルの新しい所有者のユーザー名。
new_tablespace: テーブルの移動先のテーブルスペースの名前。
new_schema: テーブルの移動先のスキーマの名前。
partition_name: 新しいパーティションとしてアタッチするか、テーブルからデタッチするテーブルの名前。
partition_bound_spec: 新しいパーティションのパーティション境界仕様。
説明
COLUMNキーワードは省略できます。
add column句を使用して列を追加し、不揮発性のDEFAULT値を指定すると、ステートメントの実行時にデフォルト値が評価されます。 結果は、テーブルのメタデータに格納される。 この値は、既存のすべての行の列に使用されます。 DEFAULTオプションを指定しない場合、NULLが使用されます。 いずれの場合も、テーブルの書き換えは不要である。
volatile DEFAULT句を使用して列を追加するか、既存の列の型を変更すると、テーブル全体とそのインデックスが書き換えられます。 既存の列の型を変更するときに、USING句で列の内容が変更されず、古い型が新しい型に対してバイナリ強制であるか、新しい型に対して制約のないドメインである場合、テーブルの書き換えは必要ありません。 ただし、新しいインデックスが既存のインデックスと論理的に同等であることをシステムが確認できない限り、インデックスは常に再構築する必要があります。 テーブルまたはインデックスの再構築には、大きなテーブルではかなりの時間がかかり、一時的にほぼ2倍のディスクスペースが必要になる場合があります。
CHECKまたはNOT NULL制約を追加すると、テーブルがスキャンされ、既存の行が制約を満たしていることが確認されます。 テーブルの書き換えは不要です。
新しいパーティションをアタッチすると、パーティションをスキャンして、既存の行がパーティションの制約を満たしていることを確認できます。
1つのALTER TABLEステートメントで複数の変更を指定するオプションを使用すると、複数のテーブルスキャンまたはテーブル書き換えを1つのテーブル上で1回のパスに結合できます。
大きなテーブルをスキャンして新しい外部キーまたはチェック制約を確認するには長い時間がかかる場合があります。また、ALTER table ADD constraintステートメントがコミットされるまで、テーブルのその他の更新は中断されます。 NOT VALID制約オプションの主な目的は、同時更新に対する制約の追加の影響を減らすことです。 NOT VALIDオプションを使用すると、ADD CONSTRAINT句がテーブルをスキャンできなくなります。 この場合、ADD CONSTRAINT句はすぐにコミットできます。 次に、VALIDATE CONSTRAINT句を指定して、既存の行が制約を満たしていることを確認できます。 検証ステップは、トランザクションが挿入または更新する行の制約を他のトランザクションが強制するため、同時更新を一時停止する必要はありません。 既存の行のみをチェックする必要があります。 したがって、検証中に変更されるテーブルにSHARE UPDATE EXCLUSIVEロックが適用されます。 外部キー制約の場合、制約によって参照されるテーブルにもROW SHAREロックが適用されます。 同時実行性の向上に加えて、テーブルに既存の違反が含まれているシナリオでは、NOT VALIDとVALIDATE CONSTRAINTを使用できます。 制約が有効になると、新しい違反は発生せず、既存の問題はVALIDATE constraintが成功するまで修正できます。
DROP COLUMNは列を削除しませんが、列をSQL操作から非表示にします。 テーブル内の後続のINSERTおよびUPDATEステートメントには、列のnull値が格納されます。 したがって、列の削除は迅速ですが、削除された列によって占有されている領域は再利用されないため、テーブルのディスク上のサイズはすぐには縮小されません。 スペースは、既存の行が更新されるにつれて時間とともに再利用されます。
削除された列によって占有された領域の即時再利用を強制するには、テーブル全体の書き換えに使用されるALTER TABLEのいずれかの句を実行します。 これは、削除された列をnull値で置き換えることによって各行を再構築します。
ALTER TABLEの書き換え句はMVCCセーフではありません。 テーブルの書き換え後、書き換えが発生する前に取得したスナップショットを使用する同時トランザクションでは、テーブルは空になります。
SET DATA TYPE句のUSINGオプションでは、列データを現在の型から新しい型に変換できる式を指定できます。 このオプションは、変換中の列に加えて、他の列を参照できます。 これにより、SET DATA TYPE構文を使用して一般的な変換を実行できます。 ただし、この柔軟性のため、USING式は列のデフォルト値には適用されません。これは、結果がデフォルト値に必要な定数式ではない可能性があるためです。 つまり、現在のデータ型から新しいデータ型にデータを変換するための暗黙的なキャストルールまたは割り当てキャストルールがない場合、USING句が指定されていても、SET data typeはデフォルト値の変換に失敗する可能性があります。 上記の場合、DROP defaultでデフォルト値を削除し、ALTER TYPE操作を実行してから、SET DEFAULTを使用して適切な新しいデフォルト値を追加します。 列に関連するインデックスと制約にも同様の考慮事項が適用されます。
テーブルに子テーブルがある場合、親テーブルでのみ列の追加、名前変更、またはタイプの変更はできません。 子テーブルでも同じ操作を実行する必要があります。 これにより、子テーブルが常に親テーブルの列と一致する列を持つようになります。 親テーブルのCHECK制約の名前は、すべての子テーブルの制約の名前を変更しないとできません。 これにより、CHECK制約も親テーブルとその子テーブルの間で一致します。 この制限は、インデックスベースの制約には適用されません。 子テーブルを持つ親テーブルに対してSELECT操作を実行すると、クエリは親テーブルからデータを取得し、その子テーブルからデータを自動的に取得します。 したがって、親テーブル内の制約は、その制約が子テーブル内でも有効としてマークされない限り、有効としてマークされることができない。 ALTER TABLE ONLYは、前述のすべてのケースで実行できません。
再帰的なDROP COLUMN操作では、子テーブルが親テーブルから列を継承せず、列の独立した定義がない場合にのみ、子テーブルの列が削除されます。 非再帰的なドロップコラム (ALTER TABLE ONLY...) DROP COLUMN操作では、子テーブル列は削除されませんが、継承ではなく独立して定義されたものとしてマークされます。 テーブルのすべてのパーティションがパーティション分割ルートと同じ列を持つ必要があるため、非再帰的なDROP COLUMN操作はパーティション分割テーブルで失敗します。
ID列のアクション (ADD GENERATED、SET、DROP identity) 、およびTRIGGER、CLUSTER、OWNER、TABLESPACEは子テーブルに再帰しません。 制約の追加は、NOINHERITとしてマークされていないCHECK制約に対してのみ再帰します。
システムカタログの一部を変更することはできません。
例
varchar型の列をテーブルに追加するには、次のステートメントを実行します。
ALTER TABLEディストリビューターADD COLUMNアドレスvarchar(30);このステートメントは、テーブル内の既存のすべての行に、新しい列のnull値を入力します。
null以外のデフォルト値を持つ列を追加するには、次のステートメントを実行します。
ALTERテーブル測定
COLUMN mtimeタイムスタンプをタイムゾーンで追加DEFAULT now(); このステートメントは、既存の行を新しい列の値として現在の時刻で塗りつぶし、新しい行を新しい列の値として挿入した時刻で塗りつぶします。
列を追加して、後で使用するデフォルト値とは異なる値で埋めるには、次のステートメントを実行します。
ALTER TABLEトランザクション
COLUMNステータスvarcharを追加 (30) DEFAULT 'old' 、
ALTER COLUMNステータスSETデフォルト 'current'; このステートメントは、既存の行を新しい列の値としてoldで塗りつぶし、新しい行を新しい列のデフォルト値としてcurrentで塗りつぶします。 上記の効果を得るには、2つの句を別々のALTER TABLEステートメントで発行します。
テーブルから列を削除するには、次のステートメントを実行します。
ALTER TABLEディストリビューターDROP COLUMNアドレスRESTRICT;1つのALTER TABLEステートメントで2つの既存の列の型を変更するには、次のステートメントを実行します。
ALTER TABLEディストリビューター
ALTER COLUMNアドレスTYPE varchar(80) 、
ALTER COLUMN名TYPE varchar(100); using句を使用して列のデータ型をtimestamp with the time zoneに変更するには、次の文を実行します。
ALTER TABLE foo
ALTER COLUMN foo_timestamp SET DATA TYPEタイムスタンプとタイムゾーン
使用
タイムゾーン「epoch」 + foo_timestamp * 間隔「1秒」のタイムスタンプ。列に新しいデータ型に自動的にキャストできない既定の式がある場合は、次のステートメントを実行します。
ALTER TABLE foo
ALTER COLUMN foo_timestamp DROPデフォルト、
ALTER COLUMN foo_timestampタイムゾーン付きTYPEタイムスタンプ
使用
タイムゾーン「epoch」 + foo_timestamp * 間隔「1秒」のタイムスタンプ、
ALTER COLUMN foo_timestamp SET DEFAULT now(); 既存の列の名前を変更するには、次のステートメントを実行します。
ALTER TABLEディストリビューターがCOLUMNアドレスを都市に登録します。既存のテーブルの名前を変更するには、次のステートメントを実行します。
ALTER TABLEディストリビューターがサプライヤーに改名。既存の制約の名前を変更するには、次のステートメントを実行します。
ALTER TABLEディストリビューターがCONSTRAINT zipchkをzip_checkに変更します。null以外の制約を列に追加するには、次のステートメントを実行します。
ALTER TABLEディストリビューターALTER COLUMN street SET NOT NULL;列からnull以外の制約を削除するには、次のステートメントを実行します。
ALTER TABLEディストリビューターALTER COLUMN street DROP NOT NULL;テーブルとその子テーブルにチェック制約を追加するには、次のステートメントを実行します。
ALTER TABLEディストリビューターはCONSTRAINT zipchkチェックを追加します (char_length(zipcode) = 5);子テーブルではなくテーブルにチェック制約を追加するには、次のステートメントを実行します。
ALTER TABLEディストリビューターは、CONSTRAINT zipchk CHECK (char_length(zipcode) = 5) INHERITを追加します。チェック制約は、将来の子テーブルによって継承されません。
テーブルとその子テーブルからチェック制約を削除するには、次のステートメントを実行します。
ALTER TABLEディストリビューターDROP CONSTRAINT zipchk;子テーブルからではなくテーブルからチェック制約を削除するには、次のステートメントを実行します。
ALTER TABLEのみディストリビューターDROP CONSTRAINT zipchk;チェック制約は、distributorsという名前のテーブルの子テーブルに対して引き続き有効です。
外部キー制約をテーブルに追加するには、次のステートメントを実行します。
ALTER TABLEディストリビューターはCONSTRAINT distfk外国キー (アドレス) 参照アドレス (アドレス) を追加します。外部キー制約をテーブルに追加し、テーブルのパフォーマンスへの影響を最小限に抑えるには、次のステートメントを実行します。
ALTER TABLEディストリビューターは、CONSTRAINT FOREIGN KEY (アドレス) REFERENCESアドレス (アドレス) NOT VALIDを追加します。
ALTER TABLEディストリビューターVALIDATE CONSTRAINT distfk; (マルチカラム) 一意の制約をテーブルに追加するには、次のステートメントを実行します。
ALTER TABLEディストリビューターADD CONSTRAINT dist_id_zipcode_key UNIQUE (dist_id、zipcode);自動名前付きプライマリキー制約をテーブルに追加するには、次のステートメントを実行します。 テーブルにはプライマリキーを1つだけ持つことができます。
ALTER TABLEディストリビューターが主要キーを追加 (dist_id);テーブルを別のテーブルスペースに移動するには、次のステートメントを実行します。
ALTER TABLEディストリビューターSET TABLESPACE fasttablespace;テーブルを別のスキーマに移動するには、次の文を実行します。
ALTER TABLE myschema.distributors SET SCHEMA yourschema;主キー制約を再作成し、テーブルへの書き込み操作を妨げずにインデックスを構築できるようにするには、次のステートメントを実行します。
ディストリビューター (dist_id) でUNIQUE INDEX CONCURRENTLY dist_id_temp_idxを作成します。
ALTER TABLEディストリビューターDROP CONSTRAINT distributors_pkey、
インデックスdist_id_temp_idxを使用してCONSTRAINT distributors_pkey PRIMARYキーを追加します。パーティションをレンジパーティションテーブルにアタッチするには、次のステートメントを実行します。
ALTERテーブル測定
('2016-07-01 ') から ('2016-08-01') までの値の取り付けPARTITION measurement_y2016m07; パーティションをリストパーティションテーブルにアタッチするには、次のステートメントを実行します。
ALTERテーブル都市
ATTACH PARTITION cities_ab FOR VALUES IN ('a' 、'b'); パーティションをハッシュパーティションテーブルにアタッチするには、次のステートメントを実行します。
ALTERテーブル注文
ATTACH PARTITION orders_p4 FOR VALUES WITH (MODULUS 4、REMAINDER 3); パーティションテーブルに既定のパーティションをアタッチするには、次のステートメントを実行します。
ALTERテーブル都市
ATTACH PARTITION cities_partdef DEFAULT; パーティションテーブルからパーティションをデタッチするには、次のステートメントを実行します。
ALTERテーブル測定
DETACH PARTITION measurement_y2015m12;