si può solo fare modifiche nel contesto di una riga in conflitto nella zona ON DUPLICATE KEY
. Inoltre, questo è, per quanto ne so, una proprietà della dichiarazione INSERT
.
Ciò di cui hai bisogno è una semplice contabilità in cui registrare le aggiunte e le sottrazioni da un saldo, quindi tabulare quelle manualmente o utilizzando i trigger.
Per esempio, l'approccio più semplice è:
INSERT INTO points_adjustments (boardId_from, boardId_to, points)
VALUES (?, ?, ?)
Questo potrebbe essere più facilmente rappresentato come un paio di voci:
INSERT INTO points_adjustments (boardId, points)
VALUES (?, ?)
Faresti aggiungere una voce per + n punti, e uno corrispondente per -n. In qualsiasi momento è possibile ottenere un saldo utilizzando SUM(points)
. È possibile concludere questo in uno VIEW
per semplificare il recupero o, se lo si desidera, denormalizzare le somme in una colonna di un'altra tabella utilizzando un trigger.
Un semplice grilletto avrebbe emesso la seguente dichiarazione per ogni colpiti boardId
:
INSERT INTO balances (boardId, points) VALUES (?, ?)
ON DUPLICATE KEY SET points=points+VALUES(points)
Questo evita le collisioni chiave in primo luogo e fornisce un record verificabile delle operazioni che si sono verificati.
In ogni caso, per fare tutto questo automaticamente dovresti probabilmente usare un trigger.
La mia ipotesi è che questo sarebbe più semplice con 2 query (ish) e un blocco if/else. C'è una ragione particolare per cui vuoi farlo in questo modo? – landons
Ottenere il massimo dai poteri di una lingua è una buona pratica. Si tratta di scoprire cose e fare le cose nel modo più veloce possibile. –
Spero davvero che questo abbia [il corretto escape di SQL] (http://bobby-tables.com/) se è distribuito in produzione. Vedere variabili nude come queste è preoccupante. – tadman