SQLServer2005をADO使用したPGに於いての話です


一般的に良くある処理で
 ”対象レコードが有ればUPDATE、無ければINSERT”
と言う様なDB操作を行いたい時

SELECTで有無を確認して有=UPDATE、無=INSERT

と言った方式以外に何か良い方式は無いでしょうか?

いきなりUPDATE、エラーならINSERTも有りとは思いますが
どうでしょうか?

REPLACE INTO的なのは無いのでしょうか?

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2009/05/08 14:01:12
  • 終了:2009/05/13 13:50:19

回答(2件)

id:frkw2004 No.1

ふるるP回答回数192ベストアンサー獲得回数212009/05/08 15:44:21

ポイント35pt

Delete してから Insert する。

0件Deleteをエラーにはしない設定(通常はエラーではないでしょう)にしておけば、

エラーなしで処理が終わります。

どちらにしろ、トランザクションは必要です。

2008にはMerge Into文があるそうなのですが、2005には無いので、ストアドを作られた方もいるようです。

http://d.hatena.ne.jp/machi_pon/20080726/1216998886

id:legnum No.2

legnum回答回数43ベストアンサー獲得回数52009/05/10 11:10:42

ポイント35pt

MERGEステートメントというものがありますがSQLserver2008からですね

http://www.atmarkit.co.jp/fdb/rensai/sqlsvr08rev/3/sqlsvr08rev03...

  • id:kn1967
    「SELECTして確認してからINSERT」とか
    「エラーならINSERT」というような方法よりは
    「INSERTしてからUPDATE」が一番楽かも・・・

    回答権ないから、詳細無しのコメントで。
  • id:gin106
    ???
    UPDATEでエラーならINSERT

    INSERTでエラーならUPDATE

    この2つの方式の優劣は、扱うデータにより変わるだけである
    と思ってたのですが、何か其の他で差異が有るのでしょうか?

    原則的にTRANSACTION処理が必須ですが・・・・

    実は、このTRANSACTION処理を止める事が出来ないか?と考え
    たのです。
  • id:gin106
    MERGEとか有るみたいですが・・・・2008から?
  • id:kn1967
    UPDATE でエラーならというのはDBから結果を受け取り
    アプリ側でINSERTを行うかどうかの判定とINSERTすべきデータの準備
    およびSQLの発行処理が必要。
    (ストアドやトリガで対処するという方法もある。)

    INSERT でエラーならという表現をしたが、処理としてはエラーを無視するだけ。
    INSERTとUPDATEを連続して発行(あるいは複数クエリとして1発)するだけ
    なのでアプリ側の負担もなければアプリとDB間の通信も抑えられる。

    いずれにしてもトランザクションなくしては
    データに齟齬が生まれる可能性がありトランザクションは無視できないが
    明示的にBEGIN-COMMIT/ROLLBACKするのではなく、極力システムに任せるには
    どうすれば良いかという方向からも比較してみてほしい。

    回答権無いので、ここまでね。

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

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

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

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません