我有一张桌子,其中包含商店ID和玩家ID,以及玩家的积分。 我想要做的是将点从一个商店转移到另一个商店,事实是商店ID和玩家ID形成一个独特的索引。我想要做的是重复密钥更新,而不是让它失败,将一个条目的点添加到另一个条目并删除“from”条目。 类似的东西:
UPDATE `playerspoints`
SET `boardId`=$to
WHERE `boardId`=$from
ON DUPLICATE KEY UPDATE `points`=.... get the idea?
答案 0 :(得分:3)
您只能在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)
这首先避免了主要的冲突,并提供了发生的交易的可审计记录。
在任何情况下,要自动执行所有这些操作,您可能必须使用触发器。
答案 1 :(得分:0)
没有。您无法在MySQL中删除约束时删除记录。您可能会在更新之前执行一个检查即将发生的约束违规的触发器,但即使这样(从5.1开始),您也无法修改同一个表的数据(在这种情况下可能会导致无限循环)。
在Tadman回答之前,只有一半完成了。我个人喜欢他的想法。