ON CONFLICT
requer um índice exclusivo* para fazer a detecção de conflito. Então você só precisa criar um índice exclusivo em ambas as colunas: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
* Além de índices exclusivos, você também pode usar restrições de exclusão. Essas são um pouco mais gerais do que restrições exclusivas. Suponha que sua tabela tenha colunas para
id
e valid_time
(e valid_time
é um tsrange
), e você queria permitir id
duplicado s, mas não para períodos de tempo sobrepostos. Uma restrição exclusiva não ajudará você, mas com uma restrição de exclusão você pode dizer "excluir novos registros se o id
deles é igual a um id
antigo e também o valid_time
sobrepõe seu valid_time
."