16.9.2 一意性制約に違反した場合の対処方法(KFAA61205-Wメッセージが出力された場合)
ユニークインデクスを定義した表に対して,adbimportコマンドまたはadbidxrebuildコマンドを実行した場合,キー値の重複があり,一意性制約に違反したときでも,各コマンドの処理は続行されます。adbimportコマンドまたはadbidxrebuildコマンドの終了時,一意性制約に違反した旨を示すKFAA61205-Wメッセージが出力されます。
一意性制約に違反したユニークインデクスは,一意性制約がないB-treeインデクスとして扱われます。この状態を,一意性制約違反状態といいます。一意性制約違反状態になると,一意性制約を満たしているときと比べて,検索効率が悪くなるおそれがあります。
(1) 一意性制約違反状態かどうかを確認する方法
KFAA61205-Wメッセージを確認する以外で,ユニークインデクスが一意性制約違反状態かどうかを確認する場合は,adbdbstatusコマンドを実行します。詳細については,「10.9.3 B-treeインデクスの状態や使用量を確認したい場合」を参照してください。
(2) 一意性制約違反状態を解除する方法
ユニークインデクスの一意性制約違反状態を解除する場合,次に示す手順で対処してください。
-
重複したキー値を検索する
対象のユニークインデクスが定義された表に対してSELECT文を実行して,重複したキー値を検索してください。SELECT文の指定例を次に示します。
■SELECT文の指定例
表T1のC1列およびC2列をインデクス構成列とするユニークインデクスIX1を定義している場合に,一意性制約に違反したキー値を検索します。
SELECT "C1","C2" FROM "T1" WHERE "C1" IS NOT NULL AND "C2" IS NOT NULL GROUP BY "C1","C2" HAVING COUNT(*) >= 2
-
重複したキー値を持つ行を削除する
一意性制約に違反したキー値を持つ行を,DELETE文で削除してください。
DELETE文については,マニュアルHADB SQLリファレンスの操作系SQLのDELETE(行の削除)を参照してください。
-
B-treeインデクスを再作成する
adbidxrebuildコマンドを実行して,B-treeインデクスを再作成してください。adbidxrebuildコマンドが完了すると,一意性制約違反状態を解除できます。
adbidxrebuildコマンドについては,マニュアルHADB コマンドリファレンスのadbidxrebuild(インデクスの再作成)を参照してください。
- メモ
-
一意性制約違反状態のユニークインデクスが定義された表に対して,次に示す操作で表のデータをすべて削除した場合も,一意性制約違反状態は解除されます。
-
adbimportコマンドに-dオプション(作成モード)を指定して実行した場合
-
TRUNCATE TABLE文を実行した場合
-