Rumah >pangkalan data >tutorial mysql >Bagaimana untuk Melakukan Upserts dengan Cekap dalam SQL Server?
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?
SQL Server menyediakan beberapa penyelesaian:
1. Gunakan pernyataan MERGE
PernyataanMERGE 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!