update on duplicate key update(在重复密钥更新时更新)
本文介绍了在重复密钥更新时更新的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我有一个表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
通常,您应该尽量避免使用重复密钥更新 具有多个唯一索引的表上的子句。
这篇关于在重复密钥更新时更新的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
沃梦达教程
本文标题为:在重复密钥更新时更新
基础教程推荐
猜你喜欢
- 无法在 ubuntu 中启动 mysql 服务器 2021-01-01
- 如何在 SQL Server 的嵌套过程中处理事务? 2021-01-01
- SQL Server:只有 GROUP BY 中的最后一个条目 2021-01-01
- 使用pyodbc“不安全"的Python多处理和数据库访问? 2022-01-01
- ERROR 2006 (HY000): MySQL 服务器已经消失 2021-01-01
- 在 VB.NET 中更新 SQL Server DateTime 列 2021-01-01
- SQL Server 2016更改对象所有者 2022-01-01
- Sql Server 字符串到日期的转换 2021-01-01
- SQL Server 中单行 MERGE/upsert 的语法 2021-01-01
- 将数据从 MS SQL 迁移到 PostgreSQL? 2022-01-01