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
Lepaskan: 2025-01-22 03:32:12
asal
700 orang telah melayarinya

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan