#事象
運用の対応で、重複レコードが何かの原因で入ってしまったテーブルがあるため、重複レコードを削除しようと思っています。対象のテーブルの主キー制約を定義してあるインデックスstatusを確認しますとunusableとなっていましたので、以下の手順を開発環境で試し成功しましたので、本番環境で試しましたがうまくいきませんでした。
- 対象のテーブルの主キー制約を定義してあるインデックスをalter table disable constraint インデックス名で無効にする。
- 重複レコードを削除するdelete文を実行する。
1番目のDDL文はエラーもなく成功しました。
しかし、2番目のDML文を流すと「ORA-01502: 索引'インデックス名'またはそのパーティションが使用不可の状態です。」と表示され、失敗しました。
どうやら、1番目のDDL文でインデックスが無効の状態になっていなかったようです。開発環境では1番目のDDL文で無効になったのに。
#調べたこと
無効にする方法がほかにないかを調べてみますと、インデックスを再作成するや、削除して再度作り直すことによりunusable状態をなくしてから、無効にすればいいのかなとおもいました。
・インデックス再作成について
https://ameblo.jp/archive-redo-blog/entry-10035203640.html
・インデックス削除し、作り直す
http://tmftake.hateblo.jp/entry/20130125/oracle_constraint_unusable
#アドバイスをいただきたいこと
・調べたことに書いてある内容のことをすればインデックスのunusable状態をなくし、無効にすることができますでしょうか?
・インデックスの再作成や削除(Drop)し再度作り直すことで生じる不具合とかはありますでしょうか?
・開発環境でできて、本番環境でできてなかったような、同じような体験をしたことがある人がいれば、なぜできなかったかなどを教えていただきたいです。
#環境
Oracle Database 10g
#補足
開発環境と本番環境の内容についての情報は職場でないとかくにんできないため、それらに関する追加情報はあまり期待しないでほしいです。
#sql
・create tableで定義しているプライマリーキー対象のカラム(具体的な列名は控えさせていただきます。)
create table テーブル名(
column_1、
column_2、
column_3、
column_4、
column_5
) テーブルスペース名
・index
CREATE UNIQUE INDEX インデックス名 ON テーブル名(column_1、column_2、column_3、column_4、column_5)
・delete文
delete from テーブル名 where column_1 = パラメータ、column_2 = パラメータ、column_3 = パラメータ、column_4 = パラメータ、column_5 = パラメータ、
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/05/26 15:07