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