Można jedynie dokonać zmian w kontekście jednego sprzecznych rzędu w obszarze ON DUPLICATE KEY
. Ponadto, o ile mi wiadomo, jest to właściwość oświadczenia INSERT
.
Potrzebna jest prosta księga, w której zapisuje się dodatki i odjęcia z wagi, a następnie tabuluje je ręcznie lub za pomocą wyzwalaczy.
Na przykład, najprostszym rozwiązaniem jest:
INSERT INTO points_adjustments (boardId_from, boardId_to, points)
VALUES (?, ?, ?)
To może być łatwiej reprezentowane parę wpisów:
INSERT INTO points_adjustments (boardId, points)
VALUES (?, ?)
Można by dodać jeden wpis do + n punktów, a pasujący do -n. W każdej chwili możesz uzyskać równowagę za pomocą SUM(points)
. Możesz zawinąć to w VIEW
, aby ułatwić pobieranie lub, jeśli chcesz, zdenormalizować sumy w kolumnie innej tabeli za pomocą wyzwalacza.
Prosty spust wyda następujące oświadczenie dla każdego dotkniętego boardId
:
INSERT INTO balances (boardId, points) VALUES (?, ?)
ON DUPLICATE KEY SET points=points+VALUES(points)
to uniknąć kolizji kluczowe w pierwszej kolejności i zapewnia skontrolowania rejestr transakcji, które miały miejsce.
W każdym przypadku, aby zrobić to wszystko automatycznie, prawdopodobnie będziesz musiał użyć spustu.
Zgaduję, że byłoby to prostsze z 2 (ish) zapytaniami i blokiem if/else. Czy jest jakiś szczególny powód, dla którego chcesz to zrobić w ten sposób? – landons
Jak najlepiej wykorzystać potencjał języka, to dobra praktyka. Chodzi raczej o odkrywanie rzeczy i szybsze ich wykonywanie. –
Naprawdę mam nadzieję, że to [poprawne wychodzenie SQL] (http://bobby-tables.com/), jeśli jest wdrożone do produkcji. Widzenie nagich zmiennych jest niepokojące. – tadman