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つの競合する行が見つかりました。この問題は私の既知の問題に減少します。その一括コピーはここで主キーをチェックしません。
リンクしている 文書から :
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 : -))