Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Setara dengan MySQL PADA DUPLICATE KEY UPDATE di Sql Server

Anda pada dasarnya mencari Sisipkan atau Perbarui pola terkadang disebut sebagai Upsert.

Saya merekomendasikan ini:Sisipkan atau Perbarui pola untuk Sql Server - Sam Saffron

Untuk prosedur yang akan menangani satu baris, salah satu transaksi ini akan bekerja dengan baik:

Solusi Pertama Sam Saffron (Diadaptasi untuk skema ini):

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

Solusi Kedua Sam Saffron (Diadaptasi untuk skema ini):

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

Bahkan dengan penggunaan kreatif IGNORE_DUP_KEY , Anda masih harus menggunakan blok sisipkan/perbarui atau pernyataan gabungan.

  • Penggunaan kreatif IGNORE_DUP_KEY - Paul White @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'
      );

Jawaban Gabung yang diberikan oleh Spock harus melakukan apa yang Anda inginkan.

Gabungkan belum tentu direkomendasikan. Saya menggunakannya, tetapi saya tidak akan pernah mengakuinya kepada @AaronBertrand.

  • Gunakan Perhatian dengan Pernyataan MERGE SQL Server - Aaron Bertrand

  • Bisakah saya mengoptimalkan pernyataan gabungan ini - Aaron Bertrand

  • Jika Anda menggunakan tampilan terindeks dan MERGE, harap baca ini! - Aaron Bertrand

  • Bug MERGE yang Menarik - Paul White

  • Kondisi Balapan UPSERT Dengan Penggabungan



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL Server 2016:Buat Pengguna Basis Data

  2. Perbandingan Tipe Data Tanggal &Waktu di SQL Server

  3. Bagaimana cara menggunakan GROUP BY untuk menggabungkan string di SQL Server?

  4. Akses ke kumpulan Hasil dari dalam Prosedur tersimpan Transact-SQL SQL Server

  5. Jangan Gunakan sp_depends di SQL Server (Sudah Usang)