表に列を追加する

ALTER TABLE ステートメントに ADD COLUMN 文節を指定することによって、新しい列を表に追加することができます。

始める前に

定義したい列の属性を決定します。 指定できる属性、その他のルール、および新しいカラムを追加する際の制限に関する詳細は、「ALTER TABLE ステートメント」 の「カラムの追加」を参照してください。

列を追加すると、後続のポイント・イン・タイム・リカバリー要求に影響する可能性があることに注意してください。 制限の可能性、リカバリ状況への影響、その他の考慮事項については、「ポイント・イン・タイム・リカバリ」 を参照してください。

新しい列に値が割り当てられると、行が強制的に別のページ物理ページに移動されるため、パフォーマンスが低下する可能性があります。 この状態は、通常の拡張部分を収容する十分なフリー・スペースがある表スペースを確認することで回避できます。 この問題が既に発生している場合は、表スペースに対して REORG を実行して解決することができます。 詳細は、「テーブルスペースの空き領域の確保 」を参照してください。

このタスクについて

新しい列を追加すると、その列が表の右端の列になります。 Db2は、列の属性に基づいて既存の行の値を決定します。 デフォルトが特殊レジスターの場合、既存の行の値は、列の追加時の設定になります。 ただし、新しい列に値が明示的に割り当てられるか、表スペースが再編成されるまで、既存の物理データ・レコードは変更されない可能性があります。

表がシステム期間テンポラル表またはアーカイブ対応の場合、新しい列は関連付けられた履歴表またはアーカイブ表にも追加されます。

ほとんどの場合、表スペースは、通知 REORG-pending (AREO*) 状態になります。 しかし、テーブル空間は、新しい列が生成値を必要とし、既存のすべての行に同じデフォルト値を使用できない以下の型のいずれかである場合など、特定の状況下では、REORG保留中(REORP)の制限されたステータスになります
  • ROWID 列
  • ID 列
  • 行変更タイム・スタンプ列
  • 行開始列
  • 行終了列
  • トランザクション開始 ID 列

プロシージャー

新しい列を表に追加するには、以下の手順を実行します。

  1. ALTER TABLE ステートメントを発行し、ADD COLUMN 文節に新しい列の属性を指定します。
  2. 物理データ・レコードの新しい列の値をマテリアライズするために、表スペースに対して REORG ユーティリティーを実行することを検討してください。 表スペースが制限付き REORG ペンディング (REORP) 状況になっている場合は、このステップが必要です。
    REORG ユーティリティーは、既存の各行の新しい列に必要な値を生成し、生成された値をデータベースに物理的に保管し、REORP 状況を除去します。
  3. アプリケーションを確認し、静的 SQL ステートメントを更新して新しい列を受け入れます。 その後、プログラムを再コンパイルし、パッケージを再バインドしてください。

    例えば、以下の状況では、アプリケーションの更新が必要になる場合があります。

    • SELECT * を使用するステートメントは、パッケージの再バインド後に新しい列の値を戻し始めます。
    • 列名のリストがない INSERT ステートメントは、ステートメントがすべての列のリストを (暗黙的に非表示として定義されていない限り) 左から右の順序で指定することを意味します。 このようなステートメントは、新しい列が追加された後も引き続き実行できますが、パッケージが再バインドされると、Db2はこの状態に対してエラーを返します。 この問題を回避するには、常に INSERT ステートメントに列名をリストすることをお勧めします。
  4. 新しい列が、特定のシステム・デフォルトに基づくデフォルトを持つ DATE、TIME、または TIMESTAMP 列である場合は、無効にされた従属パッケージを再バインドします。
    詳細は、「パッケージが無効になる変更 」を参照してください。

汎用プログラミングインターフェース情報の開始。以下の例では、表 DSN8910.DEPT に列を追加します。この表には、部門のロケーション・コードが含まれています。 列名は LOCATION_CODE で、そのデータ・タイプは CHAR (4) です。

ALTER TABLE DSN8910.DEPT
  ADD LOCATION_CODE CHAR (4);

汎用プログラミングインターフェース情報の終了。

次の作業

表に以前に固定長レコードが含まれていた場合、新しい列を追加すると、Db2はそれらを可変長レコードとして扱い、アクセス時間は即時に影響を受ける可能性があります。 レコードを固定長に戻すには、以下のステップを実行します。

  1. インライン・コピーを使用して、表スペースに COPY オプションを指定した REORG ユーティリティーを実行する。
  2. DELETE オプションを指定して MODIFY ユーティリティーを実行し、前のステップで REORG の前に作成されたすべてのイメージ・コピーのレコードを削除します。