Nur eine Zeile einfügen, wenn sie noch nicht vorhanden ist
Ich hatte immer etwas Ähnliches wie das Folgende verwendet, um es zu erreichen:
INSERT INTO TheTable
SELECT
@primaryKey,
@value1,
@value2
WHERE
NOT EXISTS
(SELECT
NULL
FROM
TheTable
WHERE
PrimaryKey = @primaryKey)
... aber einmal unter Last trat eine Primärschlüsselverletzung auf. Dies ist die einzige Anweisung, die überhaupt in diese Tabelle eingefügt wird. Bedeutet das also, dass die obige Aussage nicht atomar ist?
Das Problem ist, dass dies fast unmöglich ist, nach Belieben neu zu erstellen.
Vielleicht könnte ich es in so etwas wie das folgende ändern:
INSERT INTO TheTable
WITH
(HOLDLOCK,
UPDLOCK,
ROWLOCK)
SELECT
@primaryKey,
@value1,
@value2
WHERE
NOT EXISTS
(SELECT
NULL
FROM
TheTable
WITH
(HOLDLOCK,
UPDLOCK,
ROWLOCK)
WHERE
PrimaryKey = @primaryKey)
Obwohl, vielleicht verwende ich die falschen Sperren oder verwende zu viele Sperren oder so.
Ich habe andere Fragen auf stackoverflow.com gesehen, bei denen die Antworten ein "IF (SELECT COUNT (*) ... INSERT" usw. vorschlagen, aber ich war immer unter der (möglicherweise falschen) Annahme, dass eine einzelne SQL-Anweisung atomar sein würde .
Hat jemand irgendwelche Ideen?