Rumah >pangkalan data >tutorial mysql >Bagaimanakah UPSERT SQLite Mengendalikan Kemas Kini Separa dan Sisipan dengan Cekap?

Bagaimanakah UPSERT SQLite Mengendalikan Kemas Kini Separa dan Sisipan dengan Cekap?

Susan Sarandon
Susan Sarandonasal
2025-01-22 03:32:12671semak imbas

How Does SQLite's UPSERT Handle Partial Updates and Inserts Efficiently?

Memahami Fungsi UPSERT SQLite

Operasi UPSERT, gabungan INSERT dan UPDATE, mengendalikan pengubahsuaian data dengan cekap dengan mengemas kini rekod sedia ada atau memasukkan rekod baharu mengikut keperluan. Walaupun SQLite menyokong UPSERT secara langsung, mengoptimumkan penggunaannya untuk kemas kini separa memerlukan pertimbangan yang teliti.

Sintaks UPSERT SQLite

Diperkenalkan dalam SQLite versi 3.24.0, klausa ON CONFLICT membolehkan kawalan UPSERT yang tepat. Contohnya:

<code class="language-sql">INSERT OR REPLACE INTO table (id, name)
VALUES (1, 'John Foo') ON CONFLICT(id) DO UPDATE SET name = 'John Foo';</code>

Ini mengemas kini medan name jika rekod dengan padanan id wujud; jika tidak, ia memasukkan baris baharu.

Mengatasi Kemas Kini Separa

Menguruskan kemas kini separa—mengubah suai lajur tertentu sahaja sambil membiarkan yang lain tidak disentuh—membawakan cabaran. Pertimbangkan senario ini: kemas kini Blob1 dan Blob2, tetapi biarkan Blob3 tidak berubah jika rekod wujud; jika tidak, tetapkan Blob3 kepada NULL.

Penyelesaian Kemas Kini Separa yang Cekap

Klausa ON CONFLICT menyediakan penyelesaian yang elegan:

<code class="language-sql">INSERT INTO table (id, Blob1, Blob2, Blob3)
VALUES (1, 'Data1', 'Data2', NULL)
ON CONFLICT(id) DO UPDATE SET
  Blob1 = 'Data1',
  Blob2 = 'Data2';</code>

Pendekatan ini hanya mengemas kini Blob1 dan Blob2 apabila konflik (padanan id) berlaku. Yang penting, jika rekod tiada, INSERT menetapkan Blob3 kepada NULL seperti yang dinyatakan.

Kaedah Alternatif (Kurang Cekap)

Sebagai alternatif, gabungan SELECT dan REPLACE boleh mencapai hasil yang sama:

<code class="language-sql">SELECT name INTO @name FROM Employee WHERE id = 1;
REPLACE INTO Employee (id, role) VALUES (1, 'code monkey', @name);</code>

Ini mengekalkan nilai name asal dengan membacanya terlebih dahulu. Walau bagaimanapun, kaedah ini secara amnya memperkenalkan lebih banyak overhed berbanding pendekatan ON CONFLICT.

Atas ialah kandungan terperinci Bagaimanakah UPSERT SQLite Mengendalikan Kemas Kini Separa dan Sisipan dengan Cekap?. 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