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?

Antworten auf die Frage(12)

Ihre Antwort auf die Frage