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

Hvad er den bedste praksis for at indsætte en post, hvis den ikke allerede eksisterer?

Når du skal garantere entydigheden af ​​poster på en betingelse, der ikke kan udtrykkes ved en UNIK eller PRIMÆR NØGLE-begrænsning, skal du virkelig sikre dig, at kontrollen for eksistens og indsættelse udføres i én transaktion. Du kan opnå dette ved enten:

  1. Brug af én SQL-sætning til at udføre kontrollen og indsættelsen (din tredje mulighed)
  2. Brug af en transaktion med det passende isolationsniveau

Der er dog en fjerde måde, der vil hjælpe dig med at strukturere din kode bedre og også få den til at fungere i situationer, hvor du skal behandle en batch af poster på én gang. Du kan oprette en TABLE-variabel eller en midlertidig tabel, indsætte alle de poster, der skal indsættes der, og derefter skrive INSERT-, UPDATE- og DELETE-sætningerne baseret på denne variabel.

Nedenfor er en (pseudo)kode, der demonstrerer denne tilgang:

-- Logic to create the data to be inserted if necessary DECLARE @toInsert TABLE (idCol INT PRIMARY KEY,dataCol VARCHAR(MAX)) INSERT INTO @toInsert (idCol,dataCol) VALUES (1,'row 1'),(2,'row 2'),(3,'row 3') -- Logic to insert the data INSERT INTO realTable (idCol,dataCol) SELECT TI.* FROM @toInsert TI WHERE NOT EXISTS (SELECT 1 FROM realTable RT WHERE RT.dataCol=TI.dataCol)

I mange situationer bruger jeg denne tilgang, da den gør TSQL-koden nemmere at læse, mulig at omstrukturere og anvende enhedstest på.



  1. Indeks autoincrement for Microsoft SQL Server 2008 R2

  2. PostgreSQL:ved hjælp af en beregnet kolonne i samme forespørgsel

  3. Er det muligt at bruge en MySql brugerdefineret variabel i en .NET MySqlCommand?

  4. Ydelsesovervejelser for midlertidige data i Oracle