在重复密钥更新时更新
我有一个表playerspoints
,其中包含商店ID、玩家ID和玩家积分。
SHOP_ID | PLAYER_ID | POINTS
----------------------------------------
1 | 7 | 66
2 | 4 | 33
我想做的是将积分从一家商店转移到另一家商店。
- 问题:店铺ID和玩家ID形成唯一索引。
- 我要做的是更新重复的密钥,而不是让它失败,将一个条目的点添加到另一个条目,并从";条目中删除";。
类似于:
UPDATE `playerspoints`
SET `boardId`=$to
WHERE `boardId`=$from
ON DUPLICATE KEY UPDATE `points`=....
您明白了吗?
解决方案
您只能在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)
这首先避免了键冲突,并提供了发生的事务的可审核记录。
在任何情况下,若要自动执行所有这些操作,您可能必须使用触发器。
第三方编辑
从文档INSERT ... ON DUPLICATE KEY UPDATE Statement
通常,您应该尽量避免使用重复密钥更新 具有多个唯一索引的表上的子句。
相关文章