データベースの話ですが、削除や更新をする前に selectで該当レコードがあるかどうかの確認をするという習慣のようなものはあるでしょうか?

初めて、データベースを取り扱うプロジェクトに入ったのですが コードを見ると
selectして件数が1件以上ある事を確認してから、(同じ条件で)updateやdeleteをしています。
素人目にも、selectは無駄かと思うのですが、この業界では そのような習慣があるのでしょうか?
ちなみに、JAVAとSQL Serverを使用しています。

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2012/10/15 14:10:03
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答5件)

id:taknt No.1

回答回数13539ベストアンサー獲得回数1198

ポイント25pt

1件もないとき、エラーにしてエラー処理をしていますか?

エラーを出すために やってるということもあります。

ま、ないのにDeleteしてエラーでとまってしまうというものだったら
確認する必要があると思いますが、一概にそういうことをする必要はないと思われます。

つまりそのような習慣はないです。

id:office55

そうですよね・・・。そのような習慣は無いとの事で、安心しました。
ご回答、ありがとうございました!

2012/10/09 21:28:05
id:a-kuma3 No.2

回答回数4973ベストアンサー獲得回数2154

ポイント25pt

そういうプロジェクトの経験ありです。

汎用機の時代からソフトウェアをやっているような大手では、ちょくちょくお目にかかる気がします。
SQL がない時代からのソフトウェアを途中で書き直した、とか、プロジェクトの上級SEの頭の中が、その時代で止まっちゃってるとか。

そういうところは、以下のような現象も、同時に見ることができます :-(

  • プライマリキーが、(コードでもない)意味を持たない通番になっている
    「正規化、ってなにそれ」みたいな人もいっぱいいる
  • ひとつのカラムに、いくつものデータをぐしゃあ、っとまとめて突っ込んである
    COBOL の REDEFINE や、Fortran の COMMON のイメージ。もちろん、「正規化って(以下、省略)」
  • ひとつの SQL を隠ぺいした、アクセスルーチンと呼ばれるようなサブルーチンが大量にある
    インデックスに対する意識も希薄だし、そういったルーチンを回数を気にせず呼ぶので、いつも同じような性能対策をしてる
id:office55

こちらの世界はこちらの世界で、色々あるのですね・・。
回答、ありがとうございました。

2012/10/09 21:28:31
id:oil999 No.3

回答回数1728ベストアンサー獲得回数320

ポイント25pt

きちんと正規化されたRDBとして設計されているシステムであれば、そのような必要はありませんし、そのような習慣もありません。

正規化されておらず、updateやdeleteで複数レコードが更新/削除される可能性のあるシステムでは、いちいちselectでチェックをかけることがあります。

id:office55

>updateやdeleteで複数レコードが更新/削除される可能性のあるシステムでは、いちいちselectでチェックをかけることがあります。

なるほど。一旦、確認の意味があれば 意味があるのかもしれませんね。

2012/10/09 21:29:09
id:wild_yamato No.4

回答回数224ベストアンサー獲得回数45

ポイント25pt

 無いデータを処理することは、データのすべてを検索しなければ分かりません。
 これはデータベースの件数が多ければ多いほど時間がかかります。
 そこで、まず件数を調べて0件でない場合に処理をするのが得策です。当然ながら、インデックスにセレクト項目がなければ全件を探すことになりますが、頻度の多い処理であれば、インデックスは作成しておきますから、0件チェックの意味はありますね。

id:office55

データベースの事を良くわかっていないから
なのかもしれないですが、update,deleteでもインデックスを利用するものだと
思っていましたが、違うのでしょうか??

2012/10/09 21:29:59
id:watercooler No.5

回答回数289ベストアンサー獲得回数51

SQLの動きってDBMSによって違うわよね。

今も使われているのかは知らないけどデータが無いのにupdateしたらエラーで止まるものがあるって聞いたことがあるわ。

selectやinsertしてからupdateしたりするのはそのためだって・・・。

昔からデータベース使ってる人の基本習慣ってことね。

あなたの使ってるSQLServerだけで動けばいいなら別にどうでもいいことだと思うけど先のことは判らないわよね?

習慣や慣習って大事だと思うわよ。

  • id:Sampo
    本当に目当てのものが削除されたか確認しておきたい場合は、SELECTしてからDELETEするのではなく、DELETE命令にOUTPUTオプションを付けるというのが正しい作法になります。
    SELECT→DELETEだと、確認のためだけにトランザクションを作らないといけなくなってしまいますからね。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません