更新重复密钥更新
我有一个包含商店ID和玩家ID以及玩家点数的表格。 我想要做的是将点从一家商店转移到另一家,事情是商店ID和玩家ID形成一个独特的索引。 我想要做的是重复键更新,而不是让它失败,将一个条目的点添加到另一个条目并删除“from”条目。 就像是:
UPDATE `playerspoints`
SET `boardId`=$to
WHERE `boardId`=$from
ON DUPLICATE KEY UPDATE `points`=.... get the idea?
您只能在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)
这首先避免了重大冲突,并提供了发生事务的可审计记录。
无论如何,为了自动完成所有这些,您可能必须使用触发器。
不可以。您不能在MySQL中违反约束条件时删除记录。 你可能会做一个更新前的触发器来检查即将发生的约束冲突,但即使如此(从5.1开始),你也无法修改同一个表的数据(无论如何,这可能会导致无限循环)。
在Tadman的回答之前只完成了一半。 我个人喜欢他的想法。
链接地址: http://www.djcxy.com/p/11447.html上一篇: update on duplicate key update
下一篇: c++