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

SQLServerの重複キー更新に関するMySQLと同等

    基本的に挿入または更新パターンを探しています アップサートと呼ばれることもあります

    これをお勧めします:SQLServerのパターンの挿入または更新-Sam Saffron

    単一行を処理するプロシージャの場合、これらのトランザクションのいずれかが適切に機能します。

    Sam Saffronの最初のソリューション(このスキーマに適合):

    begin tran
    if exists (
      select * 
        from mytable with (updlock,serializable) 
        where col_a = @val_a
          and col_b = @val_b
          and col_c = @val_c
      )
      begin
        update mytable
          set col_d = @val_d
          where col_a = @val_a
            and col_b = @val_b
            and col_c = @val_c;
      end
    else
      begin
        insert into mytable (col_a, col_b, col_c, col_d)
          values (@val_a, @val_b, @val_c, @val_d);
      end
    commit tran
    

    Sam Saffronの2番目のソリューション(このスキーマに適合):

    begin tran
      update mytable with (serializable)
        set col_d = @val_d
          where col_a = @val_a
            and col_b = @val_b
            and col_c = @val_c;
      if @@rowcount = 0
        begin
            insert into mytable (col_a, col_b, col_c, col_d)
              values (@val_a, @val_b, @val_c, @val_d);
         end
    commit tran
    

    IGNORE_DUP_KEYをクリエイティブに使用しても 、挿入/更新ブロックまたはマージステートメントを使用する必要があります。

    • IGNORE_DUP_KEYのクリエイティブな使用-PaulWhite@Sql_Kiwi
    update mytable
      set col_d = 'val_d'
      where col_a = 'val_a'
        and col_b = 'val_b'
        and col_c = 'val_c';
    
    insert into mytable (col_a, col_b, col_c, col_d)
      select 'val_a','val_b', 'val_c', 'val_d'
      where not exists (select * 
        from mytable with (serializable) 
        where col_a = 'val_a'
          and col_b = 'val_b'
          and col_c = 'val_c'
          );
    

    Spockが提供するMergeの回答は、あなたが望むことをするはずです。

    マージ 必ずしも推奨されるわけではありません。私はそれを使用していますが、@AaronBertrandにそれを認めることは決してありません。

    • SQLServerのMERGEステートメントに注意してください-AaronBertrand

    • このマージステートメントを最適化できますか-AaronBertrand

    • インデックス付きビューとMERGEを使用している場合は、こちらをお読みください。 -アーロンベルトラン

    • 興味深いMERGEバグ-PaulWhite

    • マージによるUPSERTの競合状態



    1. ベストプラクティスの多言語Webサイト

    2. R12.2オンラインパッチでのシードデータの処理

    3. MySQLの主キー

    4. Oracleデータベースのテーブル名変更列を変更します