- PR -

DBへのUPDATEまたはINSERT処理に関して

投稿者投稿内容
永井和彦
ぬし
会議室デビュー日: 2002/07/03
投稿数: 276
お住まい・勤務地: 東京都
投稿日時: 2005-03-29 19:07
引用:

今回は基本的にINSERT処理が大半を占めるということで、INSERTで失敗してからUPDATEしようかと思いましたが、SQLExceptionで一意性制約を調べなければならないのと、catch句中に処理を実装するのがなんとなく気持ち悪かったので質問させていただきました。

(株)ぽちさんの書かれたようにSELECTでチェックしてからINSERT/UPDATE処理しようと思います。



catch句中に処理を実装しないのなら、基本的にcatch句を書くべきではありません。そのままthrowする方がいいです。catchを書くのはコンパイルを通すためではありません。

……と、いきなり話が逸れました。申し訳ありません。
selectでチェックしてからinsert/updateだと、並行で同様の処理が行われた場合に一意制約エラーを発生する可能性がありますので、それだけを頭の片隅にでも留めておけばおっけーだと思います。

aa
ぬし
会議室デビュー日: 2004/01/08
投稿数: 299
投稿日時: 2005-03-29 19:43
私も1ですが、サンプルでupdateしてからinsertするのも見た事があります。
ぬべたそ
ベテラン
会議室デビュー日: 2003/12/18
投稿数: 72
投稿日時: 2005-03-30 10:33
引用:

catch句中に処理を実装しないのなら、基本的にcatch句を書くべきではありません。そのままthrowする方がいいです。catchを書くのはコンパイルを通すためではありません。

……と、いきなり話が逸れました。申し訳ありません。
selectでチェックしてからinsert/updateだと、並行で同様の処理が行われた場合に一意制約エラーを発生する可能性がありますので、それだけを頭の片隅にでも留めておけばおっけーだと思います。


すいません、言葉足らずでした。
catch句中に処理を実装しないというのは、、
コード:
try{
   insert処理
}
catch{
   #とりあえずキャッチするだけ
}


ということではなく、
コード:
try{
   insert処理
}
catch{
   update処理
}


のように、あらかじめ想定される正常シーケンス(この場合はupdate処理)をcatch句中で処理するという意味でした。
catch句中にはほんとはあってはならない例外を処理するというポリシーの方がいいのかと考えて今回の質問をさせて頂きました。(みなさんがどのようにされているかお聞きしたかったもので)

並行処理の場合はたしかに一意性制約に引っかかる可能性があります。気が付きませんでした。気をつけたいと思います。

ON DELETE CASCADEに関してですが、
実績データが商品が無くても意味のあるものであれば、外部参照を設定しない、
商品が無くなったら実績データも存在する必要がないということなら、外部参照を設定しても良いのではないでしょうか?
ON DELETE CASCADEはデータベースに依存してしまいますので、移植性は低くなるかもしれません。
一般的にはみなさんどうされているんでしょうか。
(株)ぽち
ぬし
会議室デビュー日: 2002/09/10
投稿数: 376
投稿日時: 2005-03-30 11:47
引用:

taipingさんの書き込み (2005-03-30 10:33) より:
ON DELETE CASCADEに関してですが、
実績データが商品が無くても意味のあるものであれば、外部参照を設定しない、
商品が無くなったら実績データも存在する必要がないということなら、外部参照を設定しても良いのではないでしょうか?
ON DELETE CASCADEはデータベースに依存してしまいますので、移植性は低くなるかもしれません。
一般的にはみなさんどうされているんでしょうか。



要は、そのような厳密な設計が必要になってくるということではないでしょうかね。
下手に軽く考慮しただけで設定して、バグもないからよし運用だなんてやってみて
「うわ、こんなルートもあったのかあああ」なんてバグっちゃった時にデータが消え
てるともう終わりですからね。

きちんと考慮されていればいいとは思いますけど。そういう意味で玄人向けなんじゃ
ないですかね。私は使ったことないんですけど。
未記入
ぬし
会議室デビュー日: 2004/09/17
投稿数: 667
投稿日時: 2005-03-30 12:09
引用:
一般的にはみなさんどうされているんでしょうか。


ふと思った。商品テーブルと実績テーブルに連鎖削除を設定するのは怖いけど、伝票(ヘッダ)テーブルと伝票明細テーブルに連鎖削除を設定するのは使い勝手がいいかもしれない。伝票(ヘッダ)を削除することで、明細を木っ端微塵にできるので。今度、使ってみようかな。

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