sql >> Database >  >> RDS >> Sqlserver

Wat is de beste werkwijze voor het invoegen van een record als deze nog niet bestaat?

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:

  1. Een SQL-instructie gebruiken om de controle en de invoeging uit te voeren (uw derde optie)
  2. 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.



  1. Oracle 10g - optimaliseren WHERE IS NOT NULL

  2. SQL Server gebruiken als afbeeldingsopslag

  3. Weergaven gebruiken in een MySQL-database

  4. MySQL Hoe INSERT u IN EEN tabel met een SELECT-subquery die meerdere rijen retourneert?