Heim >Datenbank >MySQL-Tutorial >Wie führt man Upserts in SQL Server effizient durch?

Wie führt man Upserts in SQL Server effizient durch?

DDD
DDDOriginal
2025-01-22 16:41:11313Durchsuche

How to Efficiently Perform Upserts in SQL Server?

Führen Sie Einfüge- oder Aktualisierungsvorgänge in SQL Server effizient durch

Beim Umgang mit CRUD-Operationen kommt es häufig vor, dass Sie vorhandene Datensätze aktualisieren oder neue Datensätze einfügen müssen, obwohl der Primärschlüssel nicht vorhanden ist. Dies entspricht der Logik „IF (Primärschlüssel vorhanden) UPDATE sonst INSERT“.

Die Frage ist: Wie erreicht man dies mit optimaler Leistung?

SQL Server-Lösung

SQL Server bietet mehrere Lösungen:

1. Verwenden Sie die MERGE-Anweisung

Die

MERGE-Anweisung bietet eine prägnante Möglichkeit, diese Logik zu implementieren. Sie können damit einen Aktualisierungsvorgang angeben, der ausgeführt werden soll, wenn der Primärschlüssel vorhanden ist, und einen Einfügevorgang angeben, der ausgeführt werden soll, wenn der Primärschlüssel nicht vorhanden ist.

<code class="language-sql">MERGE INTO MyTable WITH (HOLDLOCK) AS Target
USING (VALUES (@key, @datafield1, @datafield2)) AS Source(KEY, datafield1, datafield2)
ON (Target.KEY = Source.KEY)
WHEN MATCHED THEN
    UPDATE SET datafield1 = Source.datafield1, datafield2 = Source.datafield2
WHEN NOT MATCHED THEN
    INSERT (KEY, datafield1, datafield2)
    VALUES (Source.KEY, Source.datafield1, Source.datafield2);</code>

2. Verwenden Sie Transaktionen

Ein anderer Ansatz besteht darin, Transaktionen zu verwenden, um die Datenintegrität sicherzustellen und Primärschlüsselkonflikte zu verhindern.

<code class="language-sql">BEGIN TRANSACTION;
IF EXISTS (SELECT * FROM MyTable WITH (XLOCK) WHERE KEY = @key)
BEGIN
    UPDATE MyTable SET datafield1 = @datafield1, datafield2 = @datafield2
    WHERE KEY = @key;
END
ELSE
BEGIN
    INSERT INTO MyTable (KEY, datafield1, datafield2)
    VALUES (@key, @datafield1, @datafield2);
END
COMMIT TRANSACTION;</code>

3. Verwenden Sie die OUTPUT-Klausel in Verbindung mit UPDATE und INSERT

Eine dritte Option besteht darin, eine OUTPUT-Klausel zu verwenden, um die Anzahl der von der UPDATE-Operation betroffenen Zeilen zu erfassen. Diese Informationen können dann verwendet werden, um zu bestimmen, ob eine INSERT-Operation erforderlich ist.

<code class="language-sql">BEGIN TRANSACTION;
UPDATE MyTable SET datafield1 = @datafield1, datafield2 = @datafield2
OUTPUT inserted.KEY INTO @AffectedRows
WHERE KEY = @key;

IF @AffectedRows = 0
BEGIN
    INSERT INTO MyTable (KEY, datafield1, datafield2)
    VALUES (@key, @datafield1, @datafield2);
END
COMMIT TRANSACTION;</code>

Das obige ist der detaillierte Inhalt vonWie führt man Upserts in SQL Server effizient durch?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn