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

Vložení řádku, pouze pokud tam ještě není

A co vzor „JFDI“?

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

Vážně, toto je nejrychlejší a nejvíce souběžné bez zámků, zvláště při vysokých hlasitostech. Co když je UPDLOCK eskalován a celý stůl je uzamčen?

Přečtěte si lekci 4:

Lekce 4: Při vývoji upsert proc před laděním indexů jsem nejprve věřil, že If Exists(Select…) linka by vystřelila pro jakoukoli položku a zakázala by duplikáty. Nada. Během krátké doby se vyskytly tisíce duplikátů, protože stejná položka zasáhla upsert ve stejnou milisekundu a obě transakce by viděly, že neexistuje, a provedly vložení. Po dlouhém testování bylo řešením použít jedinečný index, zachytit chybu a zkusit to znovu, aby transakce mohla vidět řádek a místo vložení provést aktualizaci.



  1. #1071 - Zadaný klíč byl příliš dlouhý; maximální délka klíče je 1000 bajtů

  2. Jak přidat indikátor AD/BC k datu v Oracle

  3. Vložit více řádků jedním dotazem MySQL

  4. Změna pole Enum pomocí Alembic