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
Mary-Kate OlsenOriginal
2025-01-12 17:44:43450Durchsuche

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>

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 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>

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>

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

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

Ausgabe:

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

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!

Stellungnahme:
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