如何让此代码片段将“目标”的值加 10?
if (buffer.empty())
break;
buffer.erase(buffer.size() - 1);
async_query("insert into " + db_name("files") + " ("
+ db_name("player") + ", "
+ db_name("goals") + ", "
+ db_name("completed") + ", "
+ db_name("fid") + ") values " + buffer
+ " on duplicate key update" + " "
+ db_name("player") + " = values("
+ db_name("player") + ")," + " "
+ db_name("goals") + " = values("
+ db_name("goals") + ")," + " "
+ db_name("completed") + " = values("
+ db_name("completed") + "),"
+ " mtime = unix_timestamp()");
buffer.clear();
最佳答案
首先,这是纯MySQL。它不适用于其他 SQL 引擎。
此外,我们的问题非常模棱两可:
如果插入命中现有的 fid
,您是希望 goals
的新值增加 10,还是保留 旧值并将其递增10?
或者你想在这两种情况下都将 goal
+ 10 的新值放在一起吗?
先清理一下
一旦 C++ 混淆移除,您的查询归结为:
insert into $db_name (player, goals, completed, fid) values $buffer
on duplicate key update
player = values(player),
goals = values(goals),
completed = values(completed),
mtime = unix_timestamp()
(变量已用$xxx
表示)
我假设 fid
是将触发 on duplicate key
的唯一索引或主键。
我希望你没有多个唯一索引,否则请求可能只会修改与输入值匹配的第一条记录。
假设 fid
是键,您的请求所做的是删除 player
、goals
和 completed
字段(并更新时间戳)如果传递了重复的 fid
。
这对我来说似乎是一件不敬虔的事情,但你肯定有你的理由。
我也想知道为什么在创建新记录时你不更新时间戳,但这不是你问题的对象......
所以基本上你在这里有 3 种可能性:
1) 在任何情况下都将goals
设置为新目标+10
这需要调整神秘缓冲区的内容,将 10 添加到新的目标值。
您的代码无需其他修改即可正常工作。
2) 将 goals
设置为新记录的新值,并为旧记录设置相同的新值 + 10
insert into $db_name (player, goals, completed, fid) values $buffer
on duplicate key update
player = values(player),
goals = values(goals) + 10,
completed = values(completed),
mtime = unix_timestamp()
3) 将 goals
设置为新记录的新值,并将旧记录的旧目标值增加 10
insert into $db_name (player, goals, completed, fid) values $buffer
on duplicate key update
player = values(player),
goals = goals + 10,
completed = values(completed),
mtime = unix_timestamp()
由于我无法理解此查询的用途,因此我让您选择解决方案。
关于php - 使用 C++ 将值添加到列中的现有 SQL 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21541363/