PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Utilizzare più conflict_target nella clausola ON CONFLICT

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