Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Tương đương với MySQL TRÊN CẬP NHẬT KHÓA DUPLICATE trong Sql Server

Về cơ bản, bạn đang tìm kiếm một mẫu Chèn hoặc Cập nhật đôi khi được gọi là Nâng cấp.

Tôi đề xuất điều này:Chèn hoặc Cập nhật mẫu cho Máy chủ Sql - Sam Saffron

Đối với một thủ tục sẽ xử lý các hàng đơn lẻ, các giao dịch này sẽ hoạt động tốt:

Giải pháp đầu tiên của Sam Saffron (Điều chỉnh cho giản đồ này):

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

Giải pháp thứ hai của Sam Saffron (Điều chỉnh cho giản đồ này):

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

Ngay cả khi sử dụng quảng cáo IGNORE_DUP_KEY , bạn vẫn gặp khó khăn khi phải sử dụng khối chèn / cập nhật hoặc câu lệnh hợp nhất.

  • Cách sử dụng IGNORE_DUP_KEY một cách sáng tạo - 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'
      );

Câu trả lời Hợp nhất do Spock cung cấp sẽ thực hiện những gì bạn muốn.

Hợp nhất không nhất thiết phải được khuyến khích. Tôi sử dụng nó, nhưng tôi không bao giờ thừa nhận điều đó với @AaronBertrand.

  • Thận trọng khi sử dụng câu lệnh MERGE của SQL Server - Aaron Bertrand

  • Tôi có thể tối ưu hóa câu lệnh hợp nhất này không - Aaron Bertrand

  • Nếu bạn đang sử dụng các chế độ xem được lập chỉ mục và MERGE, vui lòng đọc phần này! - Aaron Bertrand

  • Một lỗi MERGE thú vị - Paul White

  • Điều kiện Cuộc đua UPSERT Với Hợp nhất



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Định cấu hình vận chuyển nhật ký máy chủ SQL

  2. Sử dụng biến có TOP trong câu lệnh select trong SQL Server mà không làm cho nó động

  3. Triển khai quan hệ một-không-một trong SQL Server

  4. Cách thêm nhóm tệp vào cơ sở dữ liệu máy chủ SQL (T-SQL)

  5. Cấu hình nhóm AlwaysOn Av sẵn sàng - Phần 2