Wanneer u de uniciteit van records moet garanderen op een voorwaarde die niet kan worden uitgedrukt door een UNIEKE of PRIMARY KEY-beperking, moet u er inderdaad voor zorgen dat de controle op bestaan en invoegen in één transactie worden gedaan. U kunt dit bereiken door:
- Een SQL-instructie gebruiken om de controle en de invoeging uit te voeren (uw derde optie)
- Een transactie gebruiken met het juiste isolatieniveau
Er is echter nog een vierde manier die u zal helpen uw code beter te structureren en deze ook te laten werken in situaties waarin u een batch records tegelijk moet verwerken. U kunt een TABLE-variabele of een tijdelijke tabel maken, alle records invoegen die daarin moeten worden ingevoegd en vervolgens de instructies INSERT, UPDATE en DELETE schrijven op basis van deze variabele.
Hieronder is (pseudo)code die deze aanpak demonstreert:
-- 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)
In veel situaties gebruik ik deze aanpak omdat het de TSQL-code gemakkelijker leesbaar maakt, het mogelijk maakt om te refactoren en unit-tests toe te passen.