sql >> Databasteknik >  >> RDS >> Sqlserver

SQL Server Infoga om den inte finns

istället för under kod

BEGIN
   INSERT INTO EmailsRecebidos (De, Assunto, Data)
   VALUES (@_DE, @_ASSUNTO, @_DATA)
   WHERE NOT EXISTS ( SELECT * FROM EmailsRecebidos 
                   WHERE De = @_DE
                   AND Assunto = @_ASSUNTO
                   AND Data = @_DATA);
END

ersätt med

BEGIN
   IF NOT EXISTS (SELECT * FROM EmailsRecebidos 
                   WHERE De = @_DE
                   AND Assunto = @_ASSUNTO
                   AND Data = @_DATA)
   BEGIN
       INSERT INTO EmailsRecebidos (De, Assunto, Data)
       VALUES (@_DE, @_ASSUNTO, @_DATA)
   END
END

Uppdaterad: (tack till @Marc Durdin för att du pekade)

Observera att under hög belastning kommer detta fortfarande ibland att misslyckas, eftersom en andra anslutning kan klara testet OM INTE FINNS innan den första anslutningen exekverar INSERT, d.v.s. ett race-tillstånd. Se stackoverflow.com/a/3791506/1836776 för ett bra svar på varför ens inslag i en transaktion inte löser detta.



  1. Hur kontrollerar jag om ett värde är ett heltal i MySQL?

  2. Automatisk ökning av tabellkolumnen

  3. Oracle-funktionsexempel (returnummer)

  4. mysqli_fetch_array() förväntar sig att parameter 1 är mysqli_result, boolean ges i