Heim > Datenbank > MySQL-Tutorial > Wie gehe ich mit mehreren Konfliktzielen in der ON CONFLICT-Klausel von PostgreSQL um?

Wie gehe ich mit mehreren Konfliktzielen in der ON CONFLICT-Klausel von PostgreSQL um?

Mary-Kate Olsen
Freigeben: 2025-01-12 17:44:43
Original
446 Leute haben es durchsucht

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

Verwendung mehrerer Konfliktziele in der ON CONFLICT-Klausel

Wenn die Tabelle mehrere eindeutige Spalten enthält und die INSERT ... ON CONFLICT ... DO UPDATE-Syntax erforderlich ist, um im Falle eines Konflikts andere Spalten zu aktualisieren, müssen Sie einen eindeutigen Index erstellen, der alle Konfliktzielspalten enthält.

Frage:

Beim Versuch, mehrere Spalten als Konfliktziele in einer ON CONFLICT-Klausel zu verwenden, tritt ein Fehler auf, da zur Durchführung der Konflikterkennung ein eindeutiger Index erforderlich ist. Betrachten Sie das folgende Beispiel:

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

Lösung:

Um dieses Problem zu beheben, erstellen Sie einen eindeutigen Index für beide Spalten:

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

Nach dem Erstellen eines eindeutigen Index kann die ON CONFLICT-Klausel zwei Spalten als Konfliktziele angeben, um das gewünschte Aktualisierungsverhalten im Konfliktfall zu erreichen:

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

Beispiel:

Erstellen Sie eine Tabelle mit eindeutigen Spalten id und a und geben Sie Daten ein, während Sie Konflikte behandeln:

<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>
Nach dem Login kopieren

Abfrage ausführen, um aktualisierte Daten zu überprüfen:

<code class="language-sql">SELECT * FROM t;</code>
Nach dem Login kopieren

Ausgabe:

<code> id | a |  b  
----+---+-----
  1 | a | bar</code>
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonWie gehe ich mit mehreren Konfliktzielen in der ON CONFLICT-Klausel von PostgreSQL um?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage