更新重复密钥更新

我有一个包含商店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++