ON CONFLICT
kräver ett unikt index* för att göra konfliktdetekteringen. Så du behöver bara skapa ett unikt index på båda kolumnerna:
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
* Förutom unika index kan du även använda uteslutningsbegränsningar. Dessa är lite mer allmänna än unika begränsningar. Anta att din tabell hade kolumner för id
och valid_time
(och valid_time
är en tsrange
), och du ville tillåta dubblett av id
s, men inte för överlappande tidsperioder. En unik begränsning hjälper dig inte, men med en undantagsbegränsning kan du säga "uteslut nya poster om deras id
är lika med ett gammalt id
och även deras valid_time
överlappar dess valid_time
."