11.1.6 実表の列のデータ型を変更する方法(VARCHAR型の列のデータ長を長くする方法)
定義系SQLのALTER TABLE文で,列のデータ型を次のように変更できます。
-
データ長が1~254バイトのVARCHAR型の列のデータ長を,最大255バイトまで長くできます。
-
データ長が256~31,999バイトのVARCHAR型の列のデータ長を,最大32,000バイトまで長くできます。
- メモ
-
-
上記以外のデータ型の変更はできません。
-
VARCHAR型の列のデータ長を短くすることはできません。
-
データ長が255バイトのVARCHAR型の列のデータ長を変更することはできません。
-
ALTER TABLE文の指定例を次に示します。
- 指定例
-
店舗表(SHOPSLIST)のEMAIL_ADDRESS列のデータ型を,VARCHAR(20)からVARCHAR(30)に変更します。
ALTER TABLE "SHOPSLIST" CHANGE COLUMN "EMAIL_ADDRESS" VARCHAR(30)
- メモ
-
実表(上記の例の場合は店舗表)を定義したHADBユーザだけが,ALTER TABLE文で列のデータ型を変更できます。
留意事項
-
列のデータ型を変更する実表が更新不可状態の場合,列のデータ型を変更することはできません。この場合,実表の更新不可状態を解除したあとに,列のデータ型を変更してください。実表の更新不可状態を解除する方法については,「16.8.1 実表が更新不可状態になった場合」の「(1) 実表の更新不可状態を解除する方法」を参照してください。
-
列のデータ型を変更する実表に依存するビュー表は無効化されます。ビュー表の定義時に,データ型を変更する列名を明示的に指定しているかどうかに関係なく,ビュー表は無効化されます。
無効化されるビュー表(依存するビュー表)を調べる場合は,「11.2.11 依存するビュー表を確認する方法」を参照してください。無効化されるビュー表がある場合は,列のデータ型を変更したあとにビュー表の無効化を解除する必要があります。ビュー表の無効化を解除する方法については,「11.2.8 ビュー表の無効化を解除する方法」の「(4) ALTER TABLE文で表の列のデータ型を変更したことによってビュー表が無効化された場合」を参照してください。
-
テキストインデクスを定義している列のデータ型を変更することはできません。この場合,テキストインデクスをいったん削除してから列のデータ型を変更します。手順を次に示します。
- 手順(インデクスを再定義する場合)
-
-
削除対象のインデクスの定義情報を取得する
2.で削除するインデクスを4.で再定義できるように,インデクスの定義情報を取得しておいてください。インデクスの定義情報の取得については,「付録B.22 ディクショナリ表の検索」の「(30) インデクスの定義情報を調べる場合」を参照してください。
インデクスの定義情報がわかっている場合は,この操作を実施する必要はありません。
-
DROP INDEX文で,削除対象のインデクスを削除する
-
ALTER TABLE文で,列のデータ型を変更する
-
CREATE INDEX文で,2.で削除したインデクスを再定義する
-
adbidxrebuildコマンドで,インデクスを再作成する
-
ビュー表の無効化を解除する
列のデータ型を変更した表に依存するビュー表が無効化されています。「11.2.8 ビュー表の無効化を解除する方法」の「(4) ALTER TABLE文で表の列のデータ型を変更したことによってビュー表が無効化された場合」を参照して,ビュー表の無効化を解除してください。
-
-
次の条件をすべて満たす列のデータ型を変更することはできません。
-
列のデータ長が254バイト以下である。
-
複数列インデクスを構成する列である。
-
データ型を変更したあと,複数列インデクスを構成する列の合計長が256バイト以上になる。
複数列インデクスを構成する列の長さの求め方については,マニュアルHADB SQLリファレンスの定義系SQLのCREATE INDEX(インデクスの定義)を参照してください。
この場合,該当する複数列インデクスをいったん削除したあとに列のデータ型を変更します。手順については,上記の手順(インデクスを再定義する場合)を参照してください。
-
-
次の条件をすべて満たす列のデータ型を変更することはできません。
-
列のデータ長が256バイト以上である。
-
B-treeインデクスを構成する列である。
-
データ型を変更したあとのデータ長によって次の条件式が満たされる。
B-treeインデクスの構成列の合計長>MIN{(a÷3)-128,4036}(単位:バイト)
a:B-treeインデクスを格納するデータ用DBエリアのページサイズ
単一列インデクス,または複数列インデクスを構成する列の長さについては,マニュアルHADB SQLリファレンスの定義系SQLのCREATE INDEX(インデクスの定義)を参照してください。
この場合,変更後のデータ長を小さくできる場合は,上記の条件式を満たさないように変更後のデータ長を小さくしてください。変更後のデータ長を小さくできない場合は,adbmodareaコマンドでデータ用DBエリアをいったん削除し,ページサイズを大きくしたデータ用DBエリアを再作成してください。
-
-
外部キーの構成列のデータ型を変更することはできません。また,ほかの実表の外部キーが参照している主キーの構成列のデータ型を変更することもできません。この場合,外部キーを定義している表と,外部キーの被参照表を再定義する必要があります。次の手順で列のデータ型を変更してください。
- 手順
-
以下では,外部キーを定義している表を表T1とし,外部キーの被参照表を表T2としたときの列のデータ型の変更手順を説明しています。
-
adbexportコマンドで,表T1,表T2の全データをエクスポートする
ここで出力したファイルを,7.で表T1,表T2にデータをインポートする際の入力データファイルとして使用します。
なお,表T1,表T2がマルチチャンク表の場合,次のことに留意してください。
-
表T1,表T2のチャンクの状態と構成を維持する必要がない場合
留意事項は特にありません。表の全データを一括でファイルに出力してください。
-
表T1,表T2のチャンクの状態と構成を維持する必要がある場合
表のデータをチャンク単位でエクスポートしてください。チャンク単位でデータをエクスポートする方法については,「11.4.5 チャンク単位にデータをエクスポートする方法」を参照してください。
7.で表T1,表T2にデータをインポートする際,チャンク単位でデータをインポートします。
-
-
表T1,表T2の定義情報を確認する
表T1,表T2を定義したときのCREATE TABLE文の指定内容を確認してください。5.で表T1,表T2を再定義するときに使用します。
表T1,表T2を定義したときのCREATE TABLE文の指定内容がわからない場合は,「付録B.22 ディクショナリ表の検索」の「(29) 実表の定義情報を調べる場合」を参照してください。ディクショナリ表を検索すると,表T1,表T2を定義したときのCREATE TABLE文の指定内容が確認できます。
-
表T1,表T2に定義しているインデクスの定義情報を確認する
表T1,表T2にインデクスを定義している場合,インデクスを定義したときのCREATE INDEX文の指定内容を確認してください。6.で表T1,表T2にインデクスを定義するときに使用します。
インデクスを定義したときのCREATE INDEX文の指定内容がわからない場合は,「付録B.22 ディクショナリ表の検索」の「(30) インデクスの定義情報を調べる場合」を参照してください。ディクショナリ表を検索すると,インデクスを定義したときのCREATE INDEX文の指定内容が確認できます。
-
DROP TABLE文で,表T1,表T2を削除する
削除動作の指定を省略して,DROP TABLE文を実行してください。
-
CREATE TABLE文で,表T2,表T1を再定義する
2.で確認した表T2,表T1を定義したときのCREATE TABLE文の指定内容を流用して,表T2と表T1のCREATE TABLE文を作成してください。
- 重要
-
-
被参照表である表T2を先に定義してください。
-
主キーの構成列と外部キーの構成列が同じデータ型(変更後のデータ型)になるように,表T2と表T1を再定義してください。
-
-
CREATE INDEX文で,表T1,表T2にインデクスを定義する
表T1,表T2にインデクスを定義していた場合,CREATE INDEX文で表T1,表T2にインデクスを定義してください。
3.で確認したインデクスを定義したときのCREATE INDEX文の指定内容を流用して,CREATE INDEX文を作成してください。
-
adbimportコマンドで,表T1,表T2にデータをインポートする
1.で出力したファイルを入力データファイルにしてください。
なお,表T1,表T2がマルチチャンク表の場合,次のことに留意してください。
-
表T1,表T2のチャンクの状態と構成を維持する必要がない場合
adbimportコマンドを実行する際,-dオプションおよび-bオプションを指定しないでください。
-
表T1,表T2のチャンクの状態・構成を維持する必要がある場合
1.でチャンク単位でエクスポートしたデータを,チャンク単位でインポートしてください。
-
初回のインポートでは,-dオプションおよび-bオプションを指定しないで,adbimportコマンドを実行してください。
-
2回目以降のインポートでは,-bオプションを指定してadbimportコマンドを実行してください(バックグラウンドインポートを実行してください)。
-
1.のときにカレントチャンクだったチャンクのデータは,必ず最後にインポートしてください(バックグラウンドインポートを実行してください)。
-
-
-
ビュー表の無効化を解除する
4.で表T1,表T2を削除したため,表T1,表T2に依存するビュー表が無効化されています。
「11.2.11 依存するビュー表を確認する方法」を参照して,表T1,表T2に依存するビュー表を確認してください。依存するビュー表がある場合は,ALTER VIEW文でビュー表の無効化を解除してください。
- ヒント
-
無効化を解除するビュー表が複数ある場合,ビューレベルの値が小さい順にALTER VIEW文を実行してください。
-