Vorrei utilizzare l'insert .. su confict do update .. sintassi con una tabella che ha vincoli univoci su due colonne. È possibile?Gestione dei conflitti Postgres con più vincoli unici
ad es. mytable ha vincoli univoci separati su col1 e col2.
posso scrivere:
INSERT INTO mytable(col1, col2, col3) values ('A', 'B', 0) ON CONFLICT DO NOTHING;
Tuttavia questo non funziona:
INSERT INTO mytable(col1, col2, col3) VALUES ('A', 'B', 0)
ON CONFLICT
DO UPDATE SET col3 = EXCLUDED.col3 + 1;
ERRORE: ON CONFLICT DO aggiornamento richiede specifica deduzione o il nome del vincolo
Questo non lo fa anche lavoro:
INSERT INTO mytable(col1, col2, col3) VALUES ('A', 'B', 0)
ON CONFLICT (col1, col2)
DO UPDATE SET col3 = EXCLUDED.col3 + 1;
ERRORE: non esiste un vincolo univoco o di esclusione corrispondente alla specifica ON CONFLICT
Questa sintassi sembra essere progettata per un singolo vincolo univoco composto su due colonne, anziché due vincoli.
Esiste un modo per eseguire un aggiornamento condizionale se viene violato un vincolo univoco? Questa domanda How to upsert in Postgres on conflict on one of 2 columns? allude ad esso ma non fornisce la sintassi.
IMHO la domanda non ha senso. Nel "caso semplice in conflitto": la chiave viene mantenuta e (alcuni) i campi dipendenti vengono aggiornati. Nel tuo caso, hai intenzione di aggiornare un'altra chiave (candidata). Infatti, si tenta di aggiornare entrambe le chiavi (candidate), che è oltre la mia logica. – wildplasser
Ho aggiornato l'esempio per essere più realistico.L'idea è di mantenere aggiornata una colonna contatore che corrisponda a una colonna univoca o inserire zero se nessuno dei due esiste. –
Aggiungere un vincolo extra 'UNIQUE (col1, col2)' probabilmente farà ciò che vuoi. (è logicamente ridondante, ma il modello di dati ha comunque poco o nessun senso) – wildplasser