- - PR -
PRIMARY KEYに重複データが登録されてしまう(Oracle 10g)
投稿者 | 投稿内容 | ||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2007-09-18 21:02
みなさんこんばんわ
oracle(PL/SQL)で、表題の現象が発生して困っています。 このような現象について、なにかご存知な方がいらっしゃっれば ご教授いただけないでしょうか。 ---------------------------------------- ■現象 PL/SQLでPRIMARY KEYが重複したデータをinsertしたとき、 一意制約違反とならずに重複したデータが登録されてしまう。 (SQL+などでINSERTしたときは一意制約違反となります) その他にも以下のような現象が発生します。 ・select文で全件検索したときに、件数が異なることがある。 select count(*) from table; → 重複をまるめた件数 select count(カラム名) from table; → 重複をまるめない件数 ■環境 oracle10g(PL/SQL) ■処理の流れ 1. 配列型変数に登録データを展開(functionの引数) 2. INSERT INTO 文を実行(FORALL文を使用) 3. UPDATE 文を実行 4. 一意制約違反が発生した場合は UPDATE 文を実行(EXCEPTION) ---------------------------------------- oracleが壊れているのかなとも思うのですが、 複数環境で同様の現象が発生しておりまして・・・ お手数ですが、よろしくお願いいたします。 ---------------------------------------- 誤字を修正 [ メッセージ編集済み 編集者: からすみ 編集日時 2007-09-18 21:05 ] | ||||||||||||||||||||
|
投稿日時: 2007-09-18 21:52
いくらなんでも、これはありえないでしょう。 ありがちな所では、PK項目をvarcharで定義していて右側余白の有無の違いとか。 | ||||||||||||||||||||
|
投稿日時: 2007-09-18 21:57
saki1208です。
残念ながら、提示していただいた情報のみでは誰も答えられないと思われます。 テーブル定義、プライマリーキーの定義、実行しているPL/SQLなど、全く同一 でなくても構わないので、提示したほうが良いのではないでしょうか。 # 項目A、項目Bとするなど... プライマリーキーは仕様上一意であることが約束されているはずで、投稿され た内容は発生してはならない状況のはずです。 実行しようとしている処理がわからなければ、誰も答えられないでしょう。 # OTNのサイト等でも検索してみましたか? # 仮にOracleの不良であった場合についてですが、サポート契約を結ばれてい # るのであれば、サポートに問い合わせすることをお勧めします。 # サポート契約者にのみ公開されている内容であれば、誰も答えられません。 # (契約内容に反するため) | ||||||||||||||||||||
|
投稿日時: 2007-09-18 22:08
saki1208です。
頭が固くなっているようです。 # この発想はなかった。 確かにありえますし、ありがちですね。 # プライマリーキーをVercharにする発想がないので、思いつかなかった。orz | ||||||||||||||||||||
|
投稿日時: 2007-09-18 22:21
NULL制約はどうなっていますか? NULLを許可していると count(カラム名)はNULL以外の件数を返してくると思います。 | ||||||||||||||||||||
|
投稿日時: 2007-09-19 13:04
みなさんご回答ありがとうございます。
>こあらさん
私もPKが重複することはありえないと思いますが、 実際におこってしまっているのが現状なのです。
確かにPK項目はvarcharですが、全桁0埋めしているので考慮からははずしています。 >saki1208さん
ご指摘ありがとうございます。 後ほどDDLなど提示いたしたいと思います。
oracleへの問い合わせもおこなっています。 (私が直接ではありませんが・・・) しかし、回答まで時間がかかることが予想されるため、 わらをもすがる思いでこちらにも投稿した次第です。 [ メッセージ編集済み 編集者: からすみ 編集日時 2007-09-19 13:06 ] | ||||||||||||||||||||
|
投稿日時: 2007-09-19 13:24
>うわんさん
NULLは許可していません。 イメージ的には count(*) では DISTINCT した結果件数が返ってきているような感じです。 | ||||||||||||||||||||
|
投稿日時: 2007-09-19 13:49
不思議現象ですね。
からすみさんの所で作ったある処理を実行した時に限り、本当は一意制約違反が出て欲しいところで出ないということですか。 それともどのテーブルにどんな値を入れても同じように一意制約違反にならないということですか。 例えば、全ての列の値を定数で指定した全く同じINSERT文を二回実行するようなプログラムを作っても、一意制約違反にならないんでしょうか。 |