更新重复密钥更新

时间:2012-11-20 04:34:50

标签: mysql sql-update on-duplicate-key

我有一张桌子,其中包含商店ID和玩家ID,以及玩家的积分。 我想要做的是将点从一个商店转移到另一个商店,事实是商店ID和玩家ID形成一个独特的索引。我想要做的是重复密钥更新,而不是让它失败,将一个条目的点添加到另一个条目并删除“from”条目。 类似的东西:

UPDATE `playerspoints`
SET `boardId`=$to
WHERE `boardId`=$from
ON DUPLICATE KEY UPDATE `points`=.... get the idea?

2 个答案:

答案 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回答之前,只有一半完成了。我个人喜欢他的想法。