PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Utiliser plusieurs conflict_target dans la clause ON CONFLICT

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