sql >> Base de Datos >  >> RDS >> PostgreSQL

Use multiple conflict_target en la cláusula ON CONFLICT

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