ON CONFLICT membutuhkan indeks* unik untuk melakukan deteksi konflik. Jadi Anda hanya perlu membuat indeks unik di kedua kolom:
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
* Selain indeks unik, Anda juga dapat menggunakan batasan pengecualian. Ini sedikit lebih umum daripada batasan unik. Misalkan tabel Anda memiliki kolom untuk id dan valid_time (dan valid_time adalah tsrange ), dan Anda ingin mengizinkan duplikat id s, tetapi tidak untuk periode waktu yang tumpang tindih. Batasan unik tidak akan membantu Anda, tetapi dengan batasan pengecualian, Anda dapat mengatakan "kecualikan catatan baru jika id mereka sama dengan id lama dan juga valid_time their tumpang tindih dengan valid_time ."