ON CONFLICT
richiede un indice univoco* per eseguire il rilevamento dei conflitti. Quindi devi solo creare un indice univoco su entrambe le colonne:
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
* Oltre agli indici univoci, puoi anche utilizzare i vincoli di esclusione. Questi sono un po' più generali dei vincoli univoci. Supponiamo che la tua tabella abbia colonne per id
e valid_time
(e valid_time
è un tsrange
) e volevi consentire id
duplicati s, ma non per periodi di tempo sovrapposti. Un vincolo univoco non ti aiuterà, ma con un vincolo di esclusione puoi dire "escludi nuovi record se il loro id
è uguale a un vecchio id
e anche il loro valid_time
si sovrappone al suo valid_time
."