sql >> Database >  >> RDS >> Sqlserver

Alleen een rij invoegen als deze er nog niet is

Hoe zit het met het "JFDI"-patroon?

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

Serieus, dit is het snelst en het meest gelijktijdig zonder vergrendelingen, vooral bij hoge volumes. Wat als de UPDLOCK wordt geëscaleerd en de hele tafel wordt vergrendeld?

Lees les 4:

Les 4: Bij het ontwikkelen van de upsert-procedure voordat ik de indexen afstemde, vertrouwde ik er eerst op dat de If Exists(Select…) regel zou voor elk item worden geactiveerd en zou duplicaten verbieden. Nada. In korte tijd waren er duizenden duplicaten omdat hetzelfde item in dezelfde milliseconde de upsert zou raken en beide transacties zouden zien dat een niet bestaat en de invoeging uitvoeren. Na veel testen was de oplossing om de unieke index te gebruiken, de fout op te vangen en opnieuw te proberen de transactie de rij te laten zien en een update uit te voeren in plaats van een invoeging.



  1. Hoe RPAD() werkt in MariaDB

  2. Oracle Concurrent Manager – CP Analyzer voor E-Business Suite

  3. Oracle DateTime in Where-clausule?

  4. SQL-fout ORA-01722:ongeldig nummer