web-dev-qa-db-ja.com

ORA-01502:そのような索引の索引またはパーティションは使用可能な状態の問題です

Oracleデータベースにテーブルがあります。

select pkcol, count(*) from myTable group by pkcol having count(*) > 1;

収量

  PKCOL   COUNT(*)
------- ----------
      1          2
      2          2

重複する行を削除しようとしています

delete myTable where pkcol = 1;

収量:

ORA-01502:索引「MYTABLE.PK_MT」またはそのような索引のパーティションは使用可能な状態です。

Oracle.DataAccess.Client.OracleBulkCopyを使用してテーブルに入力しています。

ドキュメントを理解している限り Oracleから PRIMARY KEY制約を確認する必要がありました。

同じ一括コピーを2回続けて行うと、すべての行で重複して終了することがわかりました。

現在は、すべての行を削除した後でのみ使用しており、ソースとして同様の主キーを持つテーブルを使用しています。結果として、問題はないと思います。

しかし、MSビルドスクリプトの奥深くに埋め込まれているため、最終的には2210行のうち2つだけ重複しています。

そもそも主キーを無視するのは明らかなバグだと思います。一括コピーでは、主キーの制約を無視することはできません。

編集:

その間、bulkcopyが呼び出される前にスクリプトによって通常挿入される2つの競合する行が見つかりました。この問題は私の既知の問題に減少します。その一括コピーはここで主キーをチェックしません。

6
bernd_k

リンクしている 文書から

UNIQUE制約は、ロードの最後にインデックスが再構築されるときに検証されます。インデックスがUNIQUE制約に違反している場合、そのインデックスはインデックス使用不可状態のままになります。

彼らが私がそれを読む方法、同じことがPRIMARY KEY制約にも当てはまりますが、表現は少しあいまいです。この動作は気に入らないかもしれませんが、設計どおりに動作しているため「バグ」ではありません-そして、これで終了する 他の方法 があります。一種の「壊れた」制約。

詳細と、pl/sqlとforall ... save exceptionsを使用する方が効果的な方法については、 このOTN投稿 を参照してください。

同様の問題に直面しました。

エラーを取り除く必要がある場合は、次のようにします。

SELECT 'ALTER INDEX '||OWNER||'.'||INDEX_NAME||' REBUILD;'
FROM DBA_INDEXES
WHERE STATUS = 'UNUSABLE';

これにより、すべての「使用できない」インデックスのALTER INDEX ... REBUILD;ステートメントが出力されます。それらを実行して、インデックスが再び「使用可能」になるようにします。

(恥知らずにからコピー: http://www.squaredba.com/ora-01502-index-or-partition-of-such-index-is-in-unusable-state-145.html : -))

8
Frosty Z