- PR -

PRIMARY KEYに重複データが登録されてしまう(Oracle 10g)

投稿者投稿内容
こあら
大ベテラン
会議室デビュー日: 2007/06/26
投稿数: 157
投稿日時: 2007-09-19 14:04
引用:

私もPKが重複することはありえないと思いますが、
実際におこってしまっているのが現状なのです。



(意地悪でも何でも無く)にわかには信じられないのですが・・・



全く同じPK値を持つレコードが複数存在するということを、
どうやって確認しましたか?例えば以下のSQLの結果は?

コード:
select dump(PK項目) from table


コード:
select count(*) from table a, table b
where a.rowid <> b.rowid and a.PK項目 = b.PK項目



本当にOracleの重大な不具合なのでしょうか。
ある
常連さん
会議室デビュー日: 2006/01/21
投稿数: 23
投稿日時: 2007-09-20 13:17
可能性は低いと思いますが・・・
INDEXがDISABLEDになっているとか。
あとは、、、PRM_XXXXとかいう名前なんだけど
実はプライマリーとかユニークの設定じゃないとか。
(後者はうちの新人がやっていて笑ってしまった・・)
まる
会議室デビュー日: 2007/09/25
投稿数: 2
投稿日時: 2007-09-25 11:52
初めて投稿します。
実は私も同じような現象に遭遇し悩んでいたところ、この記事を見つけました。

客先に納品してあるデータをDUMP(exp.exe)し、社内のDBにそのデータを
インポートしてみたところ、PRIMARY KEYの作成に失敗しました。原因は、
重複データが存在したからでした。そこで、PRIMARY KEYを無効にしデータのみを
インポートしたら、やはりKEYの重複したデータがありました。

私も、PRIMARY KEYが重複するハズが無いと思っていたのですが、現地のDBを確認
してみたところ、確かに現地のDB(PRIMARY KEY有り)にも重複するデータが存在
しました。

インデックスを使用しないSQLでデータを抽出した場合、重複データが取得でき、
PRIMARY KEYを使用したSQLでデータを抽出した場合、重複データは取得出来ません
でした。(なんか変な日本語になっていますが・・・)
SQLの実行計画を確認したところ、TABLE ACCESS FULL となるSQLでデータを抽出すると
重複データが取得出来ました。
こあらさんのSQLを試せれば良かったのですが、現地から帰って来た後にこの記事を
見つけたもので・・・。

重複データのDB環境が手元に無いので、現在のところ色々と調査する事が出来ません。
会社のDBに同じような現象を起こそうとしても起きないのが、現状です。

一つ気になる事は、からすみさんと同じように、データの登録方法が同じで、データを
一括登録しています。(配列のデータを用いてINSERTしています)
ODP.NET の OracleParameter を使用しています。

現在も、同じキーのデータを登録しようとすると、ちゃんと一意制約違反になります。
このような状態がどうやったら作れるのかが・・・謎です。

環境は、Oracle10g ODP.NET C# です。
こあら
大ベテラン
会議室デビュー日: 2007/06/26
投稿数: 157
投稿日時: 2007-09-25 12:31
引用:
現地のDB(PRIMARY KEY有り)にも重複するデータが存在しました。


引用:
INDEXがDISABLEDになっているとか。


「現地のDB」にSQLLoaderのダイレクトモードでロードした可能性はありますか?

OTN ダイレクト・ロード、整合性制約およびトリガー
まる
会議室デビュー日: 2007/09/25
投稿数: 2
投稿日時: 2007-09-25 12:56
引用:
「現地のDB」にSQLLoaderのダイレクトモードでロードした可能性はありますか?



データの登録には、SQLLoaderを使っていませんので、
ダイレクトモードでロードした可能性というのは無いですね。

スキルアップ/キャリアアップ(JOB@IT)