ここでは、テーブルを変更する方法を紹介します。
説明
テーブルを作成し、間違いを犯したこと、またはアプリケーションの要件が変更されたことに気付いた場合は、テーブルを削除して再度作成できます。 ただし、テーブルがすでにデータで満たされている場合、またはテーブルが他のデータベースオブジェクト (たとえば、外部キー制約) によって参照されている場合、これは便利なオプションではありません。 したがって、PostgreSQLは、既存のテーブルを変更するためのコマンドファミリーを提供します。 これは、テーブルに含まれるデータを変更することとは概念的に異なることに注意してください。ここでは、テーブルの定義または構造を変更することに関心があります。
サポート内容は以下のとおりです。
列を追加
列を削除する
制約の追加
制約の削除
デフォルト値の変更
列データ型の変更
列の名前変更
テーブルの名前変更
列の追加
列を追加するには、次のようなコマンドを使用します。
ALTER TABLE製品は列の説明テキストを追加します。新しい列は、最初に指定されたデフォルト値 (default句を指定しない場合はnull) で埋められます。
PostgreSQL11から、定数のデフォルト値を持つ列を追加することは、ALTER tableステートメントの実行時にテーブルの各行を更新する必要がないことを意味します。 代わりに、デフォルト値は、行が次回アクセスされたときに返され、テーブルが書き換えられたときに適用されるため、大きなテーブルでもALTER tableが非常に高速になります。
しかしながら、デフォルト値が揮発性である場合 (例えば、clock_timestamp()) 、各行は、ALTER TABLEが実行される時点で計算された値で更新される必要がある。 潜在的に時間のかかる更新操作を避けるために、特に列をデフォルト以外の値で埋める場合は、デフォルトのない列を追加し、updateを使用して正しい値を挿入してから、以下で説明するように任意のデフォルトを追加することをお勧めします。
通常の構文を使用して、列の制約を同時に定義することもできます。
ALTER TABLE製品ADD COLUMN説明テキストCHECK (説明 <> '');実際、CREATE TABLEの列の説明に適用できるすべてのオプションをここで使用できます。 ただし、既定値が指定された制約を満たす必要があることに注意してください。そうしないと、ADDが失敗します。 または、新しい列に正しく入力した後、後で制約を追加することもできます (以下を参照) 。
列の削除
列を削除するには、次のようなコマンドを使用します。
ALTER TABLE製品ドロップコラムの説明;列にあったデータは消えます。 列を含むテーブル制約も削除されます。 ただし、列が別のテーブルの外部キー制約によって参照されている場合、PostgreSQLはその制約を黙って削除しません。 CASCADEを追加することで、列に依存するすべての削除を許可できます。
ALTER TABLE製品ドロップコラムの説明CASCADE;制約の追加
制約を追加するには、テーブル制約構文を使用します。 設定例:
ALTER TABLE製品追加チェック (name <> '');
ALTER TABLE製品はCONSTRAINT some_name UNIQUE (product_no) を追加します。ALTER TABLE製品はFOREIGN KEY (product_group_id) REFERENCES product_groups; テーブル制約として記述できないnullでない制約を追加するには、次の構文を使用します。
ALTERテーブル製品ALTER COLUMN product_no SET NOT NULL;制約はすぐにチェックされるため、テーブルデータを追加する前に制約を満たす必要があります。
制約の削除
制約を削除するには、その名前を知る必要があります。 あなたがそれに名前を付けたなら、それは簡単です。 それ以外の場合、システムは生成された名前を割り当てました。 ここでは、psqlコマンド \d tablenameが役立ちます。他のインターフェイスでもテーブルの詳細を調べることができます。 次に、コマンドは次のとおりです。
ALTER TABLE製品ドロップCONSTRAINT some_name;$2のように生成された制約名を扱う場合は、有効な識別子にするために二重引用する必要があることを忘れないでください。
列を削除する場合と同様に、他の何かが依存する制約を削除する場合は、CASCADEを追加する必要があります。 一例は、外部キー制約が、参照される列に対する一意のまたは主キー制約に依存することである。
これは、nullでない制約を除くすべての制約タイプで同じように機能します。 nullでない制約を削除するには:
ALTER TABLE製品ALTER COLUMN product_no DROP NOT NULL;列のデフォルト値の変更
列に新しいデフォルトを設定するには、次のようなコマンドを使用します。
ALTERテーブル製品ALTER COLUMN価格セットデフォルト7.77;これは、テーブル内の既存の行には影響しません。将来のINSERTコマンドのデフォルトを変更するだけです。
デフォルト値を削除するには、次を使用します。
ALTERテーブル製品ALTER COLUMN価格低下デフォルト;これは、事実上、デフォルトをnullに設定するのと同じです。 結果として、デフォルトが暗黙的にヌル値であるため、定義されていないデフォルトを破棄することはエラーではありません。
列のデータ型の変更
列を別のデータ型に変換するには、次のようなコマンドを使用します。
ALTERテーブル製品ALTER COLUMN価格タイプ数値 (10,2);これは、列内の既存の各エントリが暗黙のキャストによって新しい型に変換できる場合にのみ成功します。 より複雑な変換が必要な場合は、古い値から新しい値を計算する方法を指定するUSING句を追加できます。
PostgreSQLは、列のデフォルト値 (存在する場合) を新しい型に変換し、列に関連する制約を変換しようとします。 しかし、これらの変換は失敗するか、驚くべき結果を生み出す可能性があります。 多くの場合、型を変更する前に列の制約を削除し、その後適切に変更された制約を追加するのが最善です。
列の名前変更
列の名前を変更するには:
ALTER TABLE product_no TO product_number;テーブルの名前変更
テーブルの名前を変更するには:
ALTER TABLE製品はアイテムに名前を付けます。