你只能改变一个冲突行中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