8

I have a table playerspoints that contains a shop id and a player's id, and a player's points.

  SHOP_ID   |     PLAYER_ID     |  POINTS
  ----------------------------------------
      1     |        7          |     66
      2     |        4          |     33

What I want to do is transfer points from a shop to the other.

  • Problem: shop id and players id form a unique index.
  • What I want to do is on duplicate key update, instead of let it fail, to add the points of one entry to the other and delete the "from" entry.

Something like:

UPDATE `playerspoints`
SET `boardId`=$to
WHERE `boardId`=$from
ON DUPLICATE KEY UPDATE `points`=.... 

Do you get the idea?

4

2 回答 2

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). 您可以将其包装在 aVIEW中以使检索更容易,或者如果您愿意,可以使用触发器将总和非规范化到另一个表的列中。

一个简单的触发器将为每个受影响的 发出以下语句boardId

INSERT INTO balances (boardId, points) VALUES (?, ?)
  ON DUPLICATE KEY SET points=points+VALUES(points)

这首先避免了关键冲突,并提供了已发生交易的可审计记录。

无论如何,要自动完成所有这些操作,您可能必须使用触发器。

第三方编辑

来自文档 INSERT ... ON DUPLICATE KEY UPDATE 语句

通常,您应该尽量避免对具有多个唯一索引的表使用 ON DUPLICATE KEY UPDATE 子句。

于 2012-11-20T04:45:36.517 回答
0

不可以。您不能在 MySQL 中违反约束时删除记录。您可能会执行更新前触发器来检查即将发生的约束违规,但即便如此(从 5.1 开始)您也无法修改同一个表的数据(在这种情况下这可能会导致无限循环)。

塔德曼回答前只完成了一半。我个人喜欢他的想法。

于 2012-11-20T04:46:40.867 回答