sql >> データベース >  >> RDS >> Sqlserver

SQLServerでのINSERTまたはUPDATEのソリューション

    トランザクションを忘れないでください。パフォーマンスは良好ですが、単純な(IF EXISTS ..)アプローチは非常に危険です。
    複数のスレッドが挿入または更新を実行しようとすると、主キー違反が発生しやすくなります。

    @ Beau Crawfordと@Estebanが提供するソリューションは、一般的な考え方を示していますが、エラーが発生しやすいものです。

    デッドロックとPK違反を回避するには、次のようなものを使用できます。

    begin tran
    if exists (select * from table with (updlock,serializable) where key = @key)
    begin
       update table set ...
       where key = @key
    end
    else
    begin
       insert into table (key, ...)
       values (@key, ...)
    end
    commit tran
    

    または

    begin tran
       update table with (serializable) set ...
       where key = @key
    
       if @@rowcount = 0
       begin
          insert into table (key, ...) values (@key,..)
       end
    commit tran
    


    1. SQLServer2008のデータベースからのデータを使用して単一のテーブルをバックアップします

    2. CASE式の汚い秘密

    3. IPv6互換アドレスをリレーショナルデータベースに保存する方法

    4. ある範囲の日付の間の日付の取得