使用C++将值添加到列中现有的SQL值中。

5
我该如何修改这段代码,使得"goals"的值增加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();

你需要什么保持不变? - David G
你是想将它设置为10还是将10加到它当前的值上? - David G
我该怎么添加它,同时保留代码其余部分的功能呢? - Stan Smith
但是假设调用另一个函数会完成该函数,然后继续执行余下的代码,不是吗? 我可以添加和修改代码,但我需要确保其余部分仍然有效。 你能举个例子说明你的意思吗? - Stan Smith
没关系,我相信我们都有事情要做。感谢你的帮助。我认为我已经找到了问题所在,问题在于 C++ 的缓冲函数。但是我不知道如何移除它。 - Stan Smith
显示剩余15条评论
3个回答

1
首先,这是纯粹的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是关键字,则您的请求将删除playergoalscompleted字段(并更新时间戳),如果传递了重复的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) 为新记录设置目标的新值,并将旧记录的目标值增加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()

由于我无法理解这个查询的目的,我将让您选择解决方案。


0
如果我理解问题的话,那么这应该可以工作。虽然我不完全熟悉问题中使用的代码,但我觉得我理解你想做什么。
为什么不将其分成两个不同的MySQL查询呢?第一个在创建记录时运行,第二个在更新记录时运行。现在因为我不太了解你的代码,所以我只会写逻辑:
If the record you are going to insert does not exist, then create it

else if it does exist, get the current value of goals, add 10, the store it in a variable,  Next update the record with the variable holding the new value of goals.

我使用我的PHP知识回答了这个问题,所以我有一种感觉我可能错过了什么,所以感谢您至少尝试了这个想法,请让我知道如果这真的没有回答问题。


哇,首先让我感谢0x499602D2,真是太棒了,谢谢你让其他人帮助我解决这个问题。其次,我想感谢每一个试图帮助我的人,以及这个出色的社区。还剩下374个字符... - Stan Smith
似乎问题不在于SQL查询,而是在调用查询的C++代码中,导致值被覆盖。在找出是什么调用了覆盖之前,无论如何都会继续发生。 - Stan Smith

0

这个:

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") + " + 10)," + "  "
                           + db_name("completed") + " = values("
                           + db_name("completed") + "),"
                           + "  mtime = unix_timestamp()");

请注意,位于sql查询内部的+10位实际上在右侧表达式values()中发生。在php脚本中,则在引号内。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接