一般的に良くある処理で
”対象レコードが有ればUPDATE、無ければINSERT”
と言う様なDB操作を行いたい時
SELECTで有無を確認して有=UPDATE、無=INSERT
と言った方式以外に何か良い方式は無いでしょうか?
いきなりUPDATE、エラーならINSERTも有りとは思いますが
どうでしょうか?
REPLACE INTO的なのは無いのでしょうか?
Delete してから Insert する。
0件Deleteをエラーにはしない設定(通常はエラーではないでしょう)にしておけば、
エラーなしで処理が終わります。
どちらにしろ、トランザクションは必要です。
2008にはMerge Into文があるそうなのですが、2005には無いので、ストアドを作られた方もいるようです。
MERGEステートメントというものがありますがSQLserver2008からですね
http://www.atmarkit.co.jp/fdb/rensai/sqlsvr08rev/3/sqlsvr08rev03...
コメント(4件)
「エラーならINSERT」というような方法よりは
「INSERTしてからUPDATE」が一番楽かも・・・
回答権ないから、詳細無しのコメントで。
UPDATEでエラーならINSERT
と
INSERTでエラーならUPDATE
この2つの方式の優劣は、扱うデータにより変わるだけである
と思ってたのですが、何か其の他で差異が有るのでしょうか?
原則的にTRANSACTION処理が必須ですが・・・・
実は、このTRANSACTION処理を止める事が出来ないか?と考え
たのです。
アプリ側でINSERTを行うかどうかの判定とINSERTすべきデータの準備
およびSQLの発行処理が必要。
(ストアドやトリガで対処するという方法もある。)
INSERT でエラーならという表現をしたが、処理としてはエラーを無視するだけ。
INSERTとUPDATEを連続して発行(あるいは複数クエリとして1発)するだけ
なのでアプリ側の負担もなければアプリとDB間の通信も抑えられる。
いずれにしてもトランザクションなくしては
データに齟齬が生まれる可能性がありトランザクションは無視できないが
明示的にBEGIN-COMMIT/ROLLBACKするのではなく、極力システムに任せるには
どうすれば良いかという方向からも比較してみてほしい。
回答権無いので、ここまでね。