- ベストアンサー
※ 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エラーが起こります。この問題について解決策を教えてください。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
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//の箇所、一意性違反の時のエラーメッセージが分かりませんでした。)
その他の回答 (1)
- maura
- ベストアンサー率46% (48/104)
回答No.2
apache であれば ランダムな文字列を作らなくても mod_unique_id モジュールがあります。 これを使用すれば、別のユーザーが同じキーを持つ 判定はいらないかも。
質問者
お礼
ご回答ありがとうございます。mod_unique_id も試してみます。 これってwindowsでも使えるのですかね? ありがとうございました。
お礼
ご回答、ありがとうございます。 身近に詳しい人がいないので、ありがちな処理でいつも悩んでしまいます。 ずばりな回答ありがとうございます。 これなら、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内の文字列のマッチングという原始的な方法しか ないのでしょうか? とにかく、この問題は解決しましたので、お礼いたします。