Heim >Datenbank >MySQL-Tutorial >Wie führt man Upserts 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 bietet mehrere Lösungen:
1. Verwenden Sie die MERGE-Anweisung
DieMERGE-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!