你只能改變一個衝突行中ON DUPLICATE KEY
區域的上下文。此外,據我所知,這是INSERT
聲明的一個屬性。
您需要的是一個簡單的總賬,您可以記錄餘額的加減,然後將其手動或使用觸發器列表。
例如,最簡單的方法是:
INSERT INTO points_adjustments (boardId_from, boardId_to, points)
VALUES (?, ?, ?)
這可能更容易表現爲一對條目:
INSERT INTO points_adjustments (boardId, points)
VALUES (?, ?)
你會添加一個條目+ n個點,並一個匹配的-n。您隨時可以使用SUM(points)
獲得餘額。您可以將其包裝在VIEW
中以使檢索更容易,或者如果需要,可以使用觸發器將這些總和非規格化爲另一個表的列。
一個簡單的觸發器會發出爲每個受影響boardId
下面的語句:
INSERT INTO balances (boardId, points) VALUES (?, ?)
ON DUPLICATE KEY SET points=points+VALUES(points)
這樣就避免了在首位鍵衝突,並提供發生的交易的審計記錄。
在任何情況下,要自動完成所有這些,您可能必須使用觸發器。
我的猜測是,2(ish)查詢和if/else塊會更簡單。你有沒有想要這樣做的特殊原因? – landons
充分利用語言的潛力是一種很好的做法。它更多的是發現事物,並以更快的方式做事。 –
如果將它部署到生產中,我真的希望這有[正確的SQL轉義](http://bobby-tables.com/)。看到像這樣的裸體變數令人擔憂。 – tadman