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

Hanya menyisipkan baris jika belum ada

Bagaimana dengan pola "JFDI"?

BEGIN TRY
   INSERT etc
END TRY
BEGIN CATCH
    IF ERROR_NUMBER() <> 2627
      RAISERROR etc
END CATCH

Serius, ini tercepat dan paling bersamaan tanpa kunci, terutama pada volume tinggi. Bagaimana jika UPDLOCK dieskalasi dan seluruh tabel terkunci?

Baca pelajaran 4:

Pelajaran 4: Saat mengembangkan proc upsert sebelum menyetel indeks, pertama-tama saya percaya bahwa If Exists(Select…) baris akan menyala untuk item apa pun dan akan melarang duplikat. Nada. Dalam waktu singkat ada ribuan duplikat karena item yang sama akan mencapai upsert pada milidetik yang sama dan kedua transaksi akan melihat tidak ada dan melakukan penyisipan. Setelah banyak pengujian, solusinya adalah menggunakan indeks unik, menangkap kesalahan, dan mencoba lagi mengizinkan transaksi untuk melihat baris dan melakukan pembaruan, bukan menyisipkan.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Perbarui catatan dalam tabel dari CTE

  2. Konversi Implisit Format Sumber SSIS untuk Datetime

  3. SQL Server Tunggu Acara -1

  4. Berurusan dengan NULL di SQL Server

  5. Cara membuat Unique Constraint pada Kolom untuk Tabel yang sudah ada - Tutorial SQL Server / TSQL Part 97