web-dev-qa-db-fra.com

Multiple sur les cibles de conflit

J'ai deux index uniques sur les colonnes a et b. J'ai besoin de quelque chose comme ça:

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'

Donc, généralement, je veux faire une mise à jour différente en fonction de la cible du conflit - la syntaxe ci-dessus n'est pas prise en charge (une seule on conflict est prise en charge). Y a-t-un autre moyen de faire ça?

9
user606521

Votre exemple suggère des lignes en double dans la clause VALUES elle-même - ce qui entraînerait:

ERREUR: la commande ON CONFLICT DO UPDATE ne peut pas affecter la ligne une deuxième fois

Peut être résolu en repliant les doublons dans l'entrée. Voir:

Mais un problème connexe affecte votre requête décrite dans son ensemble, et ce n'est pas aussi facile à résoudre.

Que faire si la même ligne d'entrée déclenche plusieurs violations uniques?
Que faire si plusieurs lignes d'entrée déclenchent la même violation unique?
Que faire si plusieurs lignes d'entrée déclenchent des violations uniques distinctes de la même ligne cible?
Et leurs combinaisons.

Les développeurs de Postgres ne voulaient probablement pas ouvrir cette boîte de vers et ont limité la fonctionnalité UPSERT à une seule contrainte .

ON CONFLICT DO NOTHING - sans cible de conflit - fonctionne pour toute violation applicable. L'action alternative pour cette variante ("ne rien faire") est sans ambiguïté.

Il faudrait être beaucoup plus précis (également sur la concurrence et la charge d'écriture possible) pour obtenir une réponse plus précise.

7
Erwin Brandstetter