Wenn Sie die Eindeutigkeit von Datensätzen unter einer Bedingung garantieren müssen, die nicht durch eine UNIQUE- oder PRIMARY KEY-Einschränkung ausgedrückt werden kann, müssen Sie in der Tat sicherstellen, dass die Existenzprüfung und das Einfügen in einer Transaktion durchgeführt werden. Sie können dies folgendermaßen erreichen:
- Eine SQL-Anweisung verwenden, die die Prüfung und die Einfügung durchführt (Ihre dritte Option)
- Verwenden einer Transaktion mit der entsprechenden Isolationsstufe
Es gibt jedoch noch einen vierten Weg, der Ihnen hilft, Ihren Code besser zu strukturieren und ihn auch in Situationen zum Laufen zu bringen, in denen Sie einen Stapel von Datensätzen auf einmal verarbeiten müssen. Sie können eine TABLE-Variable oder eine temporäre Tabelle erstellen, alle Datensätze einfügen, die dort eingefügt werden müssen, und dann die INSERT-, UPDATE- und DELETE-Anweisungen basierend auf dieser Variablen schreiben.
Unten ist (Pseudo-)Code, der diesen Ansatz demonstriert:
-- 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 vielen Situationen verwende ich diesen Ansatz, da er den TSQL-Code leichter lesbar macht, umgestaltet und Unit-Tests darauf angewendet werden können.