sql >> Databasteknik >  >> RDS >> Sqlserver

Infogar bara en rad om den inte redan finns där

Hur är det med "JFDI"-mönstret?

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

Seriöst, detta är snabbast och mest samtidigt utan lås, särskilt vid höga volymer. Vad händer om UPDLOCK eskaleras och hela bordet är låst?

Läs lektion 4:

Lektion 4: När jag utvecklade upsert-processen innan jag justerade indexen litade jag först på att If Exists(Select…) linje skulle aktiveras för alla objekt och skulle förbjuda dubbletter. Nada. På kort tid fanns det tusentals dubbletter eftersom samma artikel skulle träffa upsert på samma millisekund och båda transaktionerna skulle se att en inte existerade och utföra infogningen. Efter mycket testande var lösningen att använda det unika indexet, fånga felet och försöka igen så att transaktionen kunde se raden och utföra en uppdatering istället en infogning.



  1. Hur man hittar skillnaden mellan två datum i MySQL

  2. Hur kan jag ansluta till en extern databas från en SQL-sats eller en lagrad procedur?

  3. Hur kan jag fastställa installerade SQL Server-instanser och deras versioner?

  4. Välj COUNT(*) med DISTINCT