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!