ON CONFLICT
wymaga unikalnego indeksu* do wykrywania konfliktów. Wystarczy więc utworzyć unikalny indeks w obu kolumnach:
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
* Oprócz unikalnych indeksów możesz również użyć ograniczeń wykluczenia. Są to nieco bardziej ogólne niż unikalne ograniczenia. Załóżmy, że Twoja tabela zawiera kolumny dla id
i valid_time
(i valid_time
jest tsrange
) i chciałeś zezwolić na zduplikowanie id
s, ale nie dla nakładających się okresów. Unikalne ograniczenie ci nie pomoże, ale z ograniczeniem wykluczenia możesz powiedzieć „wyklucz nowe rekordy, jeśli ich id
równa się staremu id
a także ich valid_time
nakłada się na swój valid_time
”.