• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:CGIで生成したランダムな文字列を、ユニークなカラムにINSERTする方法は?)

CGIで生成したランダムな文字列をユニークなカラムにINSERTする方法は?

このQ&Aのポイント
  • CGIで生成したランダムな文字列をユニークなカラムにINSERTする方法について知りたいです。現在、SELECTして重複をチェックしてからINSERTしていますが、他のユーザーが同じ文字列をINSERTしてしまった場合にDBエラーが起きます。この問題を解決する方法を教えてください。
  • DBにユニークなカラムにランダムな文字列をINSERTする方法について教えてください。SELECTして重複をチェックしてからINSERTしていますが、他のユーザーが同じ文字列をINSERTしてしまった場合にDBエラーが起きます。この問題をどう解決すれば良いでしょうか。
  • CGIで生成したランダムな文字列をユニークなカラムにINSERTする方法に関してアドバイスを求めます。SELECTして重複をチェックしてからINSERTしていますが、他のユーザーが同じ文字列をINSERTしてしまった場合にDBエラーが起こります。この問題について解決策を教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • thatsthat
  • ベストアンサー率55% (15/27)
回答No.1

RaiseErrorがonでも、eval{};とif($@){}で例外が拾えますので、  直接Insertを試してみて、  一意制約違反になったら、ランダム文字列を作り直し。  Insertに成功するか、その他の(おそらく致命的な)エラーが  出るまで繰り返し。 という感じでどうでしょう? while(1){  $rstr=ランダム文字列作成  eval{ $sth->execute($rstr); # insert文実行 };  if($@){   next if($DBI::errstr=~m/(一意制約違反の時のエラー文字列)/);   die $@; # 一意制約違反以外のエラーはdie  }  last; } (MySQL環境が手元にないので、  m//の箇所、一意性違反の時のエラーメッセージが分かりませんでした。)

sweepea
質問者

お礼

ご回答、ありがとうございます。 身近に詳しい人がいないので、ありがちな処理でいつも悩んでしまいます。 ずばりな回答ありがとうございます。 これなら、eval内の処理も1つだけなので、rollbackしなくても済みますね。 ちなみに、Perl+DBIの際のevalとif($@)を使用したスタイルは、 http://homepage3.nifty.com/hippo2000/perltips/dbimemo.htm を見て知っておりましたが、実際の悩みは、evalエラーの際の if($@)の中身の方でした。 つまり、予期されるエラー(一意制約違反)の時にdieされては困るけど、 予期せぬエラー(例えばSQLの構文エラー)の時に、whileでループされるのも困る。 なので、↓のようにすることで  next if($DBI::errstr=~m/Duplicate entry '$rstr'/);  die $@; 回避できるという訳ですね。 ちょっと目から鱗ですが、予期されるエラーかそうでないのかの判断は、 やはり、$DBI::errstr内の文字列のマッチングという原始的な方法しか ないのでしょうか? とにかく、この問題は解決しましたので、お礼いたします。

その他の回答 (1)

  • maura
  • ベストアンサー率46% (48/104)
回答No.2

apache であれば ランダムな文字列を作らなくても  mod_unique_id モジュールがあります。 これを使用すれば、別のユーザーが同じキーを持つ 判定はいらないかも。

参考URL:
http://apache.rsz.jp/docs-ja/1.3/mod/mod_unique_id.html
sweepea
質問者

お礼

ご回答ありがとうございます。mod_unique_id も試してみます。 これってwindowsでも使えるのですかね? ありがとうございました。

関連するQ&A