ON CONFLICT
requiere un índice único* para realizar la detección de conflictos. Entonces solo necesita crear un índice único en ambas columnas:
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
* Además de los índices únicos, también puede utilizar restricciones de exclusión. Estas son un poco más generales que las restricciones únicas. Suponga que su tabla tiene columnas para id
y valid_time
(y valid_time
es un tsrange
) y quería permitir id
duplicados s, pero no para períodos de tiempo superpuestos. Una restricción única no lo ayudará, pero con una restricción de exclusión puede decir "excluir nuevos registros si su id
es igual a un antiguo id
y también su valid_time
se superpone a su valid_time
."