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