PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Verwenden Sie mehrere Konfliktziele in der ON CONFLICT-Klausel

ON CONFLICT erfordert einen eindeutigen Index*, um die Konflikterkennung durchzuführen. Sie müssen also nur einen eindeutigen Index für beide Spalten erstellen:

t=# create table t (id integer, a text, b text);
CREATE TABLE
t=# create unique index idx_t_id_a on t (id, a);
CREATE INDEX
t=# insert into t values (1, 'a', 'foo');
INSERT 0 1
t=# insert into t values (1, 'a', 'bar') on conflict (id, a) do update set b = 'bar';
INSERT 0 1
t=# select * from t;
 id | a |  b  
----+---+-----
  1 | a | bar

* Zusätzlich zu eindeutigen Indizes können Sie auch Ausschlussbeschränkungen verwenden. Diese sind etwas allgemeiner als eindeutige Einschränkungen. Angenommen, Ihre Tabelle hätte Spalten für id und valid_time (und valid_time ist ein tsrange ), und Sie wollten doppelte id zulassen s, aber nicht für sich überschneidende Zeiträume. Eine Eindeutigkeitsbeschränkung wird Ihnen nicht helfen, aber mit einer Ausschlussbeschränkung können Sie sagen:„Neue Datensätze ausschließen, wenn ihre id entspricht einer alten id und auch ihre valid_time seine valid_time überlappt ."