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リファレンスの定義系SQLのALTER TABLE(表定義の変更)を参照してください。
- メモ
-
-
実表(上記の例の場合は店舗表)を定義したHADBユーザが,ALTER TABLE文で列を削除できます。
-
1回のALTER TABLE文で,削除できる列は1列だけです。
-
実表の列が1列だけしかない場合,その列を削除することはできません。
-
(2) 列を削除できる条件
次の1.または2.のどちらかの条件に該当する場合に,ALTER TABLE文で列を削除できます。
-
削除対象の列がALTER TABLE文で追加した列であり,かつ列を追加したあとに次のSQL文またはコマンドを実行していない場合
-
DELETE文,INSERT文,またはUPDATE文
-
adbidxrebuildコマンド,adbimportコマンド,adbmergechunkコマンド,またはadbunarchivechunkコマンド
- メモ
-
ALTER TABLE文で追加した列の定義に誤りなどがあり,追加した列を削除する場合がこのケースに該当します。
なお,上記のSQL文またはコマンドを実行した場合でも,追加した列を削除できることがあります。
また,列を追加したあとに更新行のカラム化機能を有効にした場合,追加した列を削除できないことがあります。
-
-
削除対象の列の実表に,行を格納するセグメントが割り当てられていない場合
上記の条件に該当しない場合は,TRUNCATE TABLE文で表のデータを全行削除し,行を格納するセグメントが割り当てられていない状態にします(2.の条件に該当するようにします)。そのあとに,ALTER TABLE文で列を削除します。手順については,「(4) 実表の全行を削除したあとに列を削除する方法」を参照してください。
(3) 列を削除できない条件
次のどれかの条件に該当する場合は,列を削除できません。
-
列を削除する実表が,行を格納するセグメントが割り当てられている状態であり,かつFIX表の場合
この場合,「(4) 実表の全行を削除したあとに列を削除する方法」に示す方法で列を削除してください。
-
列を削除する実表が,行を格納するセグメントが割り当てられている状態であり,かつCREATE TABLE文でBRANCH ALLを指定した実表の場合
この場合,「(4) 実表の全行を削除したあとに列を削除する方法」に示す方法で列を削除してください。
-
列を削除する実表がアーカイブマルチチャンク表の場合
この場合,「(5) アーカイブマルチチャンク表の列を削除する方法」に示す方法で列を削除してください。
-
列を削除する実表が更新不可状態の場合
この場合,実表の更新不可状態を解除したあとに,ALTER TABLE文で列を削除してください。実表の更新不可状態を解除する方法については,「16.8.1 実表が更新不可状態になった場合」の「(1) 実表の更新不可状態を解除する方法」を参照してください。
(4) 実表の全行を削除したあとに列を削除する方法
実表の全行を削除したあとに列を削除する手順を次に示します。
- 手順
-
以下では,表T1のC2列を削除する手順を説明しています。
-
adbexportコマンドで,表T1の全データをエクスポートする
ここで出力したファイルを,5.で表T1にデータをインポートする際の入力データファイルとして使用します。
なお,表T1がマルチチャンク表の場合,次のことに留意してください。
-
表T1のチャンクの状態と構成を維持する必要がない場合
留意事項は特にありません。表T1の全データを一括でファイルに出力してください。
-
表T1のチャンクの状態と構成を維持する必要がある場合
表T1のデータをチャンク単位でエクスポートしてください。チャンク単位でデータをエクスポートする方法については,「11.4.5 チャンク単位にデータをエクスポートする方法」を参照してください。
5.で表T1にデータをインポートする際,チャンク単位でデータをインポートします。
-
-
TRUNCATE TABLE文で,表T1のデータを全行削除する
TRUNCATE TABLE文を実行すると,表T1はデータが全行削除されて,行を格納するセグメントが割り当てられていない状態になります。これによって,列を削除できるようになります。
-
ALTER TABLE文で,表T1のC2列を削除する
削除動作の指定を省略して,ALTER TABLE文を実行してください。
-
列構成情報ファイルを作成する
1.で出力したファイルには,C2列のフィールドデータも格納されています。そのため,5.で表T1にデータをインポートする際,C2列のフィールドデータが,表T1にインポートされないように列構成情報ファイルを作成してください。
(例)
adbcolumninfo -n C1 -r 1 adbcolumninfo -n C3 -r 3 adbcolumninfo -n C4 -r 4
-
adbimportコマンドで,表T1にデータをインポートする
1.で出力したファイルを入力データファイルにして,adbimportコマンドを実行してください。その際,4.で作成した列構成情報ファイルを使用してください。
なお,表T1がマルチチャンク表の場合,次のことに留意してください。
-
表T1のチャンクの状態と構成を維持する必要がない場合
adbimportコマンドを実行する際,-dオプションおよび-bオプションを指定しないでください。
-
表T1のチャンクの状態・構成を維持する必要がある場合
1.でチャンク単位でエクスポートしたデータを,チャンク単位でインポートしてください。
-
初回のインポートでは,-dオプションおよび-bオプションを指定しないで,adbimportコマンドを実行してください。
-
2回目以降のインポートでは,-bオプションを指定してadbimportコマンドを実行してください(バックグラウンドインポートを実行してください)。
-
1.のときにカレントチャンクだったチャンクのデータは,必ず最後にインポートしてください(バックグラウンドインポートを実行してください)。
-
-
-
ビュー表の無効化を解除する
3.で表T1の列を削除したため,表T1に依存するビュー表が無効化されています。「11.2.8 ビュー表の無効化を解除する方法」の「(6) ALTER TABLE文で表の列を削除したことによってビュー表が無効化された場合」を参照して,表T1に依存するビュー表の無効化を解除してください。
-
(5) アーカイブマルチチャンク表の列を削除する方法
アーカイブマルチチャンク表の列を削除する手順を次に示します。
- 手順
-
以下では,アーカイブマルチチャンク表T1のC2列を削除する手順を説明しています。
-
adbdbstatusコマンドで,表T1のアーカイブ状態のチャンクを確認する
9.で,該当のチャンクをアーカイブするため,ここで確認しておきます。
-
adbexportコマンドで,表T1の全データをエクスポートする
ここで出力したファイルを,8.で表T1にデータをインポートする際の入力データファイルとして使用します。
なお,表T1のデータをチャンク単位でエクスポートしてください。チャンク単位でデータをエクスポートする方法については,「11.4.5 チャンク単位にデータをエクスポートする方法」を参照してください。
8.で表T1にデータをインポートする際,チャンク単位でデータをインポートします。
-
TRUNCATE TABLE文で,表T1のデータを全行削除する
TRUNCATE TABLE文を実行すると,表T1はデータが全行削除されて,行を格納するセグメントが割り当てられていない状態になります。
-
ALTER TABLE文で,表T1をアーカイブマルチチャンク表からレギュラーマルチチャンク表に変更する
アーカイブマルチチャンク表をレギュラーマルチチャンク表に変更する方法については,「11.4.21 アーカイブマルチチャンク表をレギュラーマルチチャンク表に変更する方法」を参照してください。
- メモ
-
3.と4.の操作によって,列を削除できるようになります。
-
ALTER TABLE文で,表T1のC2列を削除する
削除動作の指定を省略して,ALTER TABLE文を実行してください。
-
ALTER TABLE文で,表T1をレギュラーマルチチャンク表からアーカイブマルチチャンク表に変更する
レギュラーマルチチャンク表をアーカイブマルチチャンク表に変更する方法については,「11.4.20 レギュラーマルチチャンク表をアーカイブマルチチャンク表に変更する方法」を参照してください。
-
列構成情報ファイルを作成する
2.で出力したファイルには,C2列のフィールドデータも格納されています。そのため,8.で表T1にデータをインポートする際,C2列のフィールドデータが表T1にインポートされないように列構成情報ファイルを作成してください。
(例)
adbcolumninfo -n C1 -r 1 adbcolumninfo -n C3 -r 3 adbcolumninfo -n C4 -r 4
-
adbimportコマンドで,表T1にデータをインポートする
2.で出力したファイルを入力データファイルにして,adbimportコマンドを実行してください。その際,7.で作成した列構成情報ファイルを使用してください。
また,2.でチャンク単位でエクスポートしたデータを,次のことに留意してチャンク単位でインポートしてください。
-
初回のインポートでは,-dオプションおよび-bオプションを指定しないで,adbimportコマンドを実行してください。
-
2回目以降のインポートでは,-bオプションを指定してadbimportコマンドを実行してください(バックグラウンドインポートを実行してください)。
-
2.のときにカレントチャンクだったチャンクのデータは,必ず最後にインポートしてください(バックグラウンドインポートを実行してください)。
-
-
adbarchivechunkコマンドで,チャンクをアーカイブ状態にする
1.で確認した際にアーカイブ状態だったチャンクを,アーカイブ状態にしてください。
-
ビュー表の無効化を解除する
5.で表T1の列を削除したため,表T1に依存するビュー表が無効化されています。「11.2.8 ビュー表の無効化を解除する方法」の「(6) ALTER TABLE文で表の列を削除したことによってビュー表が無効化された場合」を参照して,表T1に依存するビュー表の無効化を解除してください。
-
(6) 列を削除したときの影響範囲
-
削除動作にCASCADEを指定してALTER TABLE文で列を削除した場合,次の項目が削除されます。
-
削除対象の列に定義されているインデクス
-
削除対象の列に定義されている主キー,外部キー,および削除対象の列に定義されている主キーを参照する外部キー
-
列を削除する表に依存するビュー表
-
-
削除動作を省略してALTER TABLE文で列を削除した場合,次の項目が削除されます。
-
削除対象の列に定義されているインデクス
-
削除対象の列に定義されている主キー,外部キー,および削除対象の列に定義されている主キーを参照する外部キー
また,列を削除する表に依存するビュー表が無効化されます。ビュー表の無効化を解除する方法については,「11.2.8 ビュー表の無効化を解除する方法」の「(6) ALTER TABLE文で表の列を削除したことによってビュー表が無効化された場合」を参照してください。
-
-
APなどで指定しているSQL文に削除対象の列名を指定している場合は,SQL文を修正する必要があります。
-
adbimportコマンドを実行する際に列構成情報ファイルを使用している場合は,削除した列に対応するadbcolumninfoオペランドを削除する必要があります。C2列を削除した場合の例を次に示します。
adbcolumninfo -n C1 -r 2 adbcolumninfo -n C2 -r 4 ←この行の指定を削除します。 adbcolumninfo -n C3 -r 3 adbcolumninfo -n C4 -r 1