- PR -

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

投稿者投稿内容
からすみ
会議室デビュー日: 2004/11/16
投稿数: 19
投稿日時: 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/06/26
投稿数: 157
投稿日時: 2007-09-18 21:52
引用:

PL/SQLでPRIMARY KEYが重複したデータをinsertしたとき、
一意制約違反とならずに重複したデータが登録されてしまう。



いくらなんでも、これはありえないでしょう。
ありがちな所では、PK項目をvarcharで定義していて右側余白の有無の違いとか。
saki1208
ベテラン
会議室デビュー日: 2006/08/22
投稿数: 86
投稿日時: 2007-09-18 21:57
saki1208です。

残念ながら、提示していただいた情報のみでは誰も答えられないと思われます。

テーブル定義、プライマリーキーの定義、実行しているPL/SQLなど、全く同一
でなくても構わないので、提示したほうが良いのではないでしょうか。
# 項目A、項目Bとするなど...

プライマリーキーは仕様上一意であることが約束されているはずで、投稿され
た内容は発生してはならない状況のはずです。

実行しようとしている処理がわからなければ、誰も答えられないでしょう。
# OTNのサイト等でも検索してみましたか?

# 仮にOracleの不良であった場合についてですが、サポート契約を結ばれてい
# るのであれば、サポートに問い合わせすることをお勧めします。
# サポート契約者にのみ公開されている内容であれば、誰も答えられません。
# (契約内容に反するため)
saki1208
ベテラン
会議室デビュー日: 2006/08/22
投稿数: 86
投稿日時: 2007-09-18 22:08
saki1208です。

引用:

こあらさんの書き込み (2007-09-18 21:52) より:

ありがちな所では、PK項目をvarcharで定義していて右側余白の有無の違いとか。



頭が固くなっているようです。
# この発想はなかった。

確かにありえますし、ありがちですね。
# プライマリーキーをVercharにする発想がないので、思いつかなかった。orz
うわん
ベテラン
会議室デビュー日: 2006/09/04
投稿数: 67
投稿日時: 2007-09-18 22:21
引用:

からすみさんの書き込み (2007-09-18 21:02) より:
・select文で全件検索したときに、件数が異なることがある。
  select count(*) from table; → 重複をまるめた件数
  select count(カラム名) from table; → 重複をまるめない件数


NULL制約はどうなっていますか?
NULLを許可していると count(カラム名)はNULL以外の件数を返してくると思います。
からすみ
会議室デビュー日: 2004/11/16
投稿数: 19
投稿日時: 2007-09-19 13:04
みなさんご回答ありがとうございます。


>こあらさん

引用:

引用:

PL/SQLでPRIMARY KEYが重複したデータをinsertしたとき、
一意制約違反とならずに重複したデータが登録されてしまう。



いくらなんでも、これはありえないでしょう。



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

引用:

ありがちな所では、PK項目をvarcharで定義していて右側余白の有無の違いとか。



確かにPK項目はvarcharですが、全桁0埋めしているので考慮からははずしています。


>saki1208さん

引用:

テーブル定義、プライマリーキーの定義、実行しているPL/SQLなど、全く同一
でなくても構わないので、提示したほうが良いのではないでしょうか。
# 項目A、項目Bとするなど...



ご指摘ありがとうございます。
後ほどDDLなど提示いたしたいと思います。

引用:

# 仮にOracleの不良であった場合についてですが、サポート契約を結ばれてい
# るのであれば、サポートに問い合わせすることをお勧めします。
# サポート契約者にのみ公開されている内容であれば、誰も答えられません。
# (契約内容に反するため)



oracleへの問い合わせもおこなっています。
(私が直接ではありませんが・・・)

しかし、回答まで時間がかかることが予想されるため、
わらをもすがる思いでこちらにも投稿した次第です。


[ メッセージ編集済み 編集者: からすみ 編集日時 2007-09-19 13:06 ]
からすみ
会議室デビュー日: 2004/11/16
投稿数: 19
投稿日時: 2007-09-19 13:24
>うわんさん

引用:

引用:


からすみさんの書き込み (2007-09-18 21:02) より:
・select文で全件検索したときに、件数が異なることがある。
  select count(*) from table; → 重複をまるめた件数
  select count(カラム名) from table; → 重複をまるめない件数



NULL制約はどうなっていますか?
NULLを許可していると count(カラム名)はNULL以外の件数を返してくると思います。



NULLは許可していません。

イメージ的には count(*) では DISTINCT した結果件数が返ってきているような感じです。
一郎
ぬし
会議室デビュー日: 2002/10/11
投稿数: 1081
投稿日時: 2007-09-19 13:49
不思議現象ですね。

からすみさんの所で作ったある処理を実行した時に限り、本当は一意制約違反が出て欲しいところで出ないということですか。
それともどのテーブルにどんな値を入れても同じように一意制約違反にならないということですか。

例えば、全ての列の値を定数で指定した全く同じINSERT文を二回実行するようなプログラムを作っても、一意制約違反にならないんでしょうか。

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