ON CONFLICT
nécessite un index unique* pour effectuer la détection de conflit. Il vous suffit donc de créer un index unique sur les deux colonnes :
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
* En plus des index uniques, vous pouvez également utiliser des contraintes d'exclusion. Ces contraintes sont un peu plus générales que les contraintes uniques. Supposons que votre table ait des colonnes pour id
et valid_time
(et valid_time
est un tsrange
), et vous vouliez autoriser le doublon de id
s, mais pas pour les périodes qui se chevauchent. Une contrainte unique ne vous aidera pas, mais avec une contrainte d'exclusion, vous pouvez dire "exclure les nouveaux enregistrements si leur id
est égal à un ancien id
ainsi que leur valid_time
chevauche son valid_time
."