Eu tenho dois índices exclusivos em colunas a
e b
. Eu preciso de algo assim:
insert into my_table (a, b) values (1, 2), (1, 2)
on conflict (a) do update set c = 'a_violation'
on conflict (b) do update set c = 'b_violation'
Então, geralmente, eu quero fazer uma atualização diferente com base no alvo do conflito - a sintaxe acima não é suportada (apenas uma on conflict
instrução é suportada). Existe alguma outra maneira de fazer isso?
Seu exemplo sugere linhas duplicadas na
VALUES
própria cláusula - o que resultaria em:Pode ser resolvido dobrando duplicatas na entrada. Ver:
Mas um problema relacionado afeta sua consulta delineada como um todo, e isso não é tão fácil de superar.
O que fazer se a mesma linha de entrada acionar várias violações exclusivas?
O que fazer se várias linhas de entrada acionarem a mesma violação exclusiva?
O que fazer se várias linhas de entrada acionarem violações exclusivas distintas da mesma linha de destino?
E suas combinações.
Os desenvolvedores do Postgres provavelmente não queriam abrir essa lata de worms e restringiram o recurso UPSERT a uma única restrição.
ON CONFLICT DO NOTHING
- sem alvo de conflito - funciona para qualquer violação aplicável. A ação alternativa para esta variante ("não fazer nada") é inequívoca.Você teria que ser muito mais específico (também sobre simultaneidade e possível carga de gravação) para obter uma resposta mais específica.