Rumah >pangkalan data >tutorial mysql >Bagaimana untuk Mengendalikan Pelbagai Sasaran Konflik dalam Klausa ON CONFLICT PostgreSQL?

Bagaimana untuk Mengendalikan Pelbagai Sasaran Konflik dalam Klausa ON CONFLICT PostgreSQL?

Mary-Kate Olsen
Mary-Kate Olsenasal
2025-01-12 17:44:43447semak imbas

How to Handle Multiple Conflict Targets in PostgreSQL's ON CONFLICT Clause?

Menggunakan berbilang sasaran konflik dalam klausa ON CONFICT

Jika jadual mengandungi berbilang lajur unik dan sintaks INSERT ... ON CONFLICT ... DO UPDATE diperlukan untuk mengemas kini lajur lain sekiranya berlaku konflik, anda mesti mencipta indeks unik yang mengandungi semua lajur sasaran konflik.

Soalan:

Apabila cuba menggunakan berbilang lajur sebagai sasaran konflik dalam klausa ON CONFLICT, ralat berlaku kerana indeks unik diperlukan untuk melaksanakan pengesanan konflik. Pertimbangkan contoh berikut:

<code class="language-sql">INSERT INTO table
...
ON CONFLICT (col1, col2)
DO UPDATE
SET
....</code>

Penyelesaian:

Untuk menyelesaikan isu ini, buat indeks unik pada kedua-dua lajur:

<code class="language-sql">CREATE UNIQUE INDEX idx_t_col1_col2 ON table (col1, col2);</code>

Selepas mencipta indeks unik, klausa ON CONFLICT boleh menentukan dua lajur sebagai sasaran konflik untuk mencapai gelagat kemas kini yang diingini sekiranya berlaku konflik:

<code class="language-sql">INSERT INTO table
...
ON CONFLICT (col1, col2)
DO UPDATE
SET
....</code>

Contoh:

Buat jadual dengan lajur unik id dan a dan masukkan data semasa mengendalikan konflik:

<code class="language-sql">CREATE TABLE t (id integer, a text, b text);
CREATE UNIQUE INDEX idx_t_id_a ON t (id, a);
INSERT INTO t VALUES (1, 'a', 'foo');
INSERT INTO t VALUES (1, 'a', 'bar') ON CONFLICT (id, a) DO UPDATE SET b = 'bar';</code>

Jalankan pertanyaan untuk mengesahkan data yang dikemas kini:

<code class="language-sql">SELECT * FROM t;</code>

Output:

<code> id | a |  b  
----+---+-----
  1 | a | bar</code>

Atas ialah kandungan terperinci Bagaimana untuk Mengendalikan Pelbagai Sasaran Konflik dalam Klausa ON CONFLICT PostgreSQL?. 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