È possibile eseguire in Postgres 9.5 quando il conflitto si verifica su una delle 2 colonne in una tabella.? Fondamentalmente ho 2 colonne e se una delle due colonne genera una violazione del vincolo univoco, allora vorrei eseguire l'operazione di aggiornamento.Come posticipare in Postgres in conflitto su una delle 2 colonne?
risposta
Sì, e questo comportamento è predefinito. Qualsiasi violazione del vincolo univoco costituisce un conflitto e quindi lo UPDATE
viene eseguito se è specificato ON CONFLICT DO UPDATE
. L'istruzione INSERT
può avere solo una singola clausola ON CONFLICT
, ma la clausola conflict_target
può specificare più nomi di colonna ciascuno dei quali deve avere un indice, ad esempio un vincolo UNIQUE
. Si è, tuttavia, limitato a un singolo conflict_action
e non si disporrà di informazioni su quale vincolo ha causato il conflitto durante l'elaborazione di tale azione. Se hai bisogno di quel tipo di informazioni, o di un'azione specifica a seconda della violazione del vincolo, dovresti scrivere una funzione di trigger, ma poi perdi l'atomicità fondamentale dell'istruzione INSERT ... ON CONFLICT DO ...
.
Non sono sicuro che sia corretto al 100%, ma la domanda è vaga. Se le 2 colonne hanno vincoli univoci diversi (cosa ho capito dalla domanda), allora il CONFLITTO ON può essere usato solo per NON FARE NULLA. Non riesci a concatenare o "disgiungere" il cosiddetto conflict_target. – Jeff
@Jeff Espansione della mia risposta. – Patrick
Grazie per il tuo aggiornamento. Risponde alla mia domanda su cosa sia o meno in grado di gestire due diverse violazioni con lo stesso INSERT. – Jeff