PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Use vários conflitos de destino na cláusula ON CONFLICT


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