sql >> Database teknologi >  >> RDS >> Sqlserver

Indsætter kun en række, hvis den ikke allerede er der

Hvad med "JFDI"-mønsteret?

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

Seriøst, dette er hurtigst og mest samtidig uden låse, især ved høje lydstyrker. Hvad hvis UPDLOCK er eskaleret, og hele bordet er låst?

Læs lektion 4:

Lektion 4: Da jeg udviklede upsert-processen før tuning af indekserne, stolede jeg først på, at If Exists(Select…) linje ville udløse for enhver vare og ville forbyde dubletter. Nada. I løbet af kort tid var der tusindvis af dubletter, fordi den samme vare ville ramme upsert på samme millisekund, og begge transaktioner ville se en ikke eksisterer og udføre indsættelsen. Efter megen test var løsningen at bruge det unikke indeks, fange fejlen og prøve igen, så transaktionen kunne se rækken og udføre en opdatering i stedet for en indsættelse.



  1. Der er ingen primære eller kandidatnøgler i den refererede tabel, der matcher referencekolonnelisten i den fremmede nøgle

  2. Hvordan kan jeg forbinde flere SQL-tabeller ved hjælp af ID'erne?

  3. Find alle ikke-numeriske værdier i en kolonne i Oracle

  4. Mysql rekursion?