Hitachi

Hitachi Advanced Data Binder システム構築・運用ガイド


11.1.3 実表の列を削除する方法

実表の列を削除するには,定義系SQLのALTER TABLE文を実行します。

〈この項の構成〉

(1) ALTER TABLE文の指定例

ALTER TABLE文の指定例を次に示します。

指定例

店舗表(SHOPSLIST)のEMAIL_ADDRESS列を削除します。

ALTER TABLE "SHOPSLIST"
    DROP COLUMN "EMAIL_ADDRESS"

ALTER TABLE文の指定形式および規則については,マニュアルHADB SQLリファレンス定義系SQLALTER TABLE(表定義の変更)を参照してください。

メモ
  • 実表(上記の例の場合は店舗表)を定義したHADBユーザが,ALTER TABLE文で列を削除できます。

  • 1回のALTER TABLE文で,削除できる列は1列だけです。

  • 実表の列が1列だけしかない場合,その列を削除することはできません。

(2) 列を削除できる条件

次の1.または2.のどちらかの条件に該当する場合に,ALTER TABLE文で列を削除できます。

  1. 削除対象の列がALTER TABLE文で追加した列であり,かつ列を追加したあとに次のSQL文またはコマンドを実行していない場合

    • DELETE文,INSERT文,またはUPDATE

    • adbidxrebuildコマンド,adbimportコマンド,adbmergechunkコマンド,またはadbunarchivechunkコマンド

    メモ

    ALTER TABLE文で追加した列の定義に誤りなどがあり,追加した列を削除する場合がこのケースに該当します。

    なお,上記のSQL文またはコマンドを実行した場合でも,追加した列を削除できることがあります。

    また,列を追加したあとに更新行のカラム化機能を有効にした場合,追加した列を削除できないことがあります。

  2. 削除対象の列の実表に,行を格納するセグメントが割り当てられていない場合

上記の条件に該当しない場合は,TRUNCATE TABLE文で表のデータを全行削除し,行を格納するセグメントが割り当てられていない状態にします(2.の条件に該当するようにします)。そのあとに,ALTER TABLE文で列を削除します。手順については,「(4) 実表の全行を削除したあとに列を削除する方法」を参照してください。

(3) 列を削除できない条件

次のどれかの条件に該当する場合は,列を削除できません。

(4) 実表の全行を削除したあとに列を削除する方法

実表の全行を削除したあとに列を削除する手順を次に示します。

手順

以下では,表T1C2列を削除する手順を説明しています。

  1. adbexportコマンドで,表T1の全データをエクスポートする

    ここで出力したファイルを,5.で表T1にデータをインポートする際の入力データファイルとして使用します。

    なお,表T1がマルチチャンク表の場合,次のことに留意してください。

    • T1のチャンクの状態と構成を維持する必要がない場合

      留意事項は特にありません。表T1の全データを一括でファイルに出力してください。

    • T1のチャンクの状態と構成を維持する必要がある場合

      T1のデータをチャンク単位でエクスポートしてください。チャンク単位でデータをエクスポートする方法については,「11.4.5 チャンク単位にデータをエクスポートする方法」を参照してください。

      5.で表T1にデータをインポートする際,チャンク単位でデータをインポートします。

  2. TRUNCATE TABLE文で,表T1のデータを全行削除する

    TRUNCATE TABLE文を実行すると,表T1はデータが全行削除されて,行を格納するセグメントが割り当てられていない状態になります。これによって,列を削除できるようになります。

  3. ALTER TABLE文で,表T1C2列を削除する

    削除動作の指定を省略して,ALTER TABLE文を実行してください。

  4. 列構成情報ファイルを作成する

    1.で出力したファイルには,C2列のフィールドデータも格納されています。そのため,5.で表T1にデータをインポートする際,C2列のフィールドデータが,表T1にインポートされないように列構成情報ファイルを作成してください。

    (例)

    adbcolumninfo -n C1  -r 1
    adbcolumninfo -n C3  -r 3
    adbcolumninfo -n C4  -r 4
  5. adbimportコマンドで,表T1にデータをインポートする

    1.で出力したファイルを入力データファイルにして,adbimportコマンドを実行してください。その際,4.で作成した列構成情報ファイルを使用してください。

    なお,表T1がマルチチャンク表の場合,次のことに留意してください。

    • T1のチャンクの状態と構成を維持する必要がない場合

      adbimportコマンドを実行する際,-dオプションおよび-bオプションを指定しないでください。

    • T1のチャンクの状態・構成を維持する必要がある場合

      1.でチャンク単位でエクスポートしたデータを,チャンク単位でインポートしてください。

      • 初回のインポートでは,-dオプションおよび-bオプションを指定しないで,adbimportコマンドを実行してください。

      • 2回目以降のインポートでは,-bオプションを指定してadbimportコマンドを実行してください(バックグラウンドインポートを実行してください)。

      • 1.のときにカレントチャンクだったチャンクのデータは,必ず最後にインポートしてください(バックグラウンドインポートを実行してください)。

  6. ビュー表の無効化を解除す

    3.で表T1の列を削除したため,表T1に依存するビュー表が無効化されています。「11.2.8 ビュー表の無効化を解除する方法」の「(6) ALTER TABLE文で表の列を削除したことによってビュー表が無効化された場合」を参照して,表T1に依存するビュー表の無効化を解除してください。

(5) アーカイブマルチチャンク表の列を削除する方法

アーカイブマルチチャンク表の列を削除する手順を次に示します。

手順

以下では,アーカイブマルチチャンク表T1C2列を削除する手順を説明しています。

  1. adbdbstatusコマンドで,表T1のアーカイブ状態のチャンクを確認する

    9.で,該当のチャンクをアーカイブするため,ここで確認しておきます。

  2. adbexportコマンドで,表T1の全データをエクスポートする

    ここで出力したファイルを,8.で表T1にデータをインポートする際の入力データファイルとして使用します。

    なお,表T1のデータをチャンク単位でエクスポートしてください。チャンク単位でデータをエクスポートする方法については,「11.4.5 チャンク単位にデータをエクスポートする方法」を参照してください。

    8.で表T1にデータをインポートする際,チャンク単位でデータをインポートします。

  3. TRUNCATE TABLE文で,表T1のデータを全行削除する

    TRUNCATE TABLE文を実行すると,表T1はデータが全行削除されて,行を格納するセグメントが割り当てられていない状態になります。

  4. ALTER TABLE文で,表T1をアーカイブマルチチャンク表からレギュラーマルチチャンク表に変更する

    アーカイブマルチチャンク表をレギュラーマルチチャンク表に変更する方法については,「11.4.21 アーカイブマルチチャンク表をレギュラーマルチチャンク表に変更する方法」を参照してください。

    メモ

    3.と4.の操作によって,列を削除できるようになります。

  5. ALTER TABLE文で,表T1C2列を削除する

    削除動作の指定を省略して,ALTER TABLE文を実行してください。

  6. ALTER TABLE文で,表T1をレギュラーマルチチャンク表からアーカイブマルチチャンク表に変更する

    レギュラーマルチチャンク表をアーカイブマルチチャンク表に変更する方法については,「11.4.20 レギュラーマルチチャンク表をアーカイブマルチチャンク表に変更する方法」を参照してください。

  7. 列構成情報ファイルを作成する

    2.で出力したファイルには,C2列のフィールドデータも格納されています。そのため,8.で表T1にデータをインポートする際,C2列のフィールドデータが表T1にインポートされないように列構成情報ファイルを作成してください。

    (例)

    adbcolumninfo -n C1  -r 1
    adbcolumninfo -n C3  -r 3
    adbcolumninfo -n C4  -r 4
  8. adbimportコマンドで,表T1にデータをインポートする

    2.で出力したファイルを入力データファイルにして,adbimportコマンドを実行してください。その際,7.で作成した列構成情報ファイルを使用してください。

    また,2.でチャンク単位でエクスポートしたデータを,次のことに留意してチャンク単位でインポートしてください。

    • 初回のインポートでは,-dオプションおよび-bオプションを指定しないで,adbimportコマンドを実行してください。

    • 2回目以降のインポートでは,-bオプションを指定してadbimportコマンドを実行してください(バックグラウンドインポートを実行してください)。

    • 2.のときにカレントチャンクだったチャンクのデータは,必ず最後にインポートしてください(バックグラウンドインポートを実行してください)。

  9. adbarchivechunkコマンドで,チャンクをアーカイブ状態にする

    1.で確認した際にアーカイブ状態だったチャンクを,アーカイブ状態にしてください。

  10. ビュー表の無効化を解除す

    5.で表T1の列を削除したため,表T1に依存するビュー表が無効化されています。「11.2.8 ビュー表の無効化を解除する方法」の「(6) ALTER TABLE文で表の列を削除したことによってビュー表が無効化された場合」を参照して,表T1に依存するビュー表の無効化を解除してください。

(6) 列を削除したときの影響範囲