ON CONFLICT
изисква уникален индекс* за откриване на конфликт. Така че просто трябва да създадете уникален индекс за двете колони:
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
* В допълнение към уникалните индекси, можете да използвате и ограничения за изключване. Това са малко по-общи от уникалните ограничения. Да предположим, че вашата таблица има колони за id
и valid_time
(и valid_time
е tsrange
), и искахте да разрешите дублиран id
s, но не и за припокриващи се периоди от време. Уникално ограничение няма да ви помогне, но с ограничение за изключване можете да кажете „изключете нови записи, ако техният id
равно на стар id
както и тяхното valid_time
припокрива своето valid_time
."