在重复密钥更新时更新

2022-02-24 00:00:00 sql-update mysql on-duplicate-key

我有一个表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

通常,您应该尽量避免使用重复密钥更新 具有多个唯一索引的表上的子句。

相关文章