Rumah >pangkalan data >tutorial mysql >Bagaimana untuk Melakukan Upserts dengan Cekap dalam SQL Server?

Bagaimana untuk Melakukan Upserts dengan Cekap dalam SQL Server?

DDD
DDDasal
2025-01-22 16:41:11313semak imbas

How to Efficiently Perform Upserts in SQL Server?

Lakukan operasi sisipan atau kemas kini dengan cekap dalam Pelayan SQL

Apabila berurusan dengan operasi CRUD, anda sering menghadapi situasi di mana anda perlu mengemas kini rekod sedia ada atau memasukkan rekod baharu apabila kunci utama tidak wujud. Ini bersamaan dengan logik "JIKA (kunci utama wujud) KEMASKINI lain INSERT".

Persoalannya ialah: bagaimana untuk mencapai ini dengan prestasi optimum?

Penyelesaian Pelayan SQL

SQL Server menyediakan beberapa penyelesaian:

1. Gunakan pernyataan MERGE

Pernyataan

MERGE menyediakan cara ringkas untuk melaksanakan logik ini. Ia membenarkan anda untuk menentukan operasi kemas kini yang akan dilakukan jika kunci utama wujud, dan operasi sisipan dilakukan jika kunci utama tidak wujud.

<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. Gunakan transaksi

Pendekatan lain ialah menggunakan transaksi untuk memastikan integriti data dan mencegah konflik kunci utama.

<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 Gunakan klausa OUTPUT bersama-sama dengan KEMASKINI dan INSERT

Pilihan ketiga ialah menggunakan klausa OUTPUT untuk menangkap bilangan baris yang terjejas oleh operasi KEMASKINI. Maklumat ini kemudiannya boleh digunakan untuk menentukan sama ada operasi INSERT diperlukan.

<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>

Atas ialah kandungan terperinci Bagaimana untuk Melakukan Upserts dengan Cekap dalam SQL Server?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn