sql >> Databáze >  >> RDS >> Sqlserver

Ekvivalent MySQL ON DUPLICATE KEY UPDATE na SQL Server

V podstatě hledáte vložit nebo aktualizovat vzor někdy označované jako Upsert.

Doporučuji toto:Vložit nebo aktualizovat vzor pro SQL Server - Sam Saffron

Pro proceduru, která se bude zabývat jednotlivými řádky, by dobře fungovaly buď tyto transakce:

První řešení Sama Saffrona (upraveno pro toto schéma):

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

Druhé řešení Sama Saffrona (upraveno pro toto schéma):

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

I při kreativním použití IGNORE_DUP_KEY , stále byste se zasekli při použití bloku vložení/aktualizace nebo příkazu sloučení.

  • Kreativní využití 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'
      );

Odpověď Merge poskytnutá Spockem by měla dělat to, co chcete.

Sloučit není nutně doporučeno. Používám to, ale nikdy bych to nepřiznal @AaronBertrand.

  • Buďte opatrní s příkazem SQL Server MERGE – Aaron Bertrand

  • Mohu optimalizovat tento příkaz ke sloučení - Aaron Bertrand

  • Pokud používáte indexovaná zobrazení a SLOUČENÍ, přečtěte si toto! - Aaron Bertrand

  • Zajímavá chyba MERGE - Paul White

  • UPSERT Race Condition with Merge



  1. Oracle.DataAccess.Client.OracleException ORA-03135:kontakt ztraceného připojení

  2. Jak volat funkci Oracle nebo uloženou proceduru pomocí frameworku spring persistence?

  3. Migrace MySQL na PostgreSQL na AWS RDS, část 1

  4. Existuje nějaký důvod k obavám z pořadí sloupců v tabulce?