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

时间:2014-02-04 01:31:08

标签: php c++ sql

如何将此代码段添加到“目标”的值?

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();

3 个答案:

答案 0 :(得分:1)

首先,这是纯粹的 MySQL 。它不会在其他SQL引擎上工作。

此外,我们的问题很模糊:

如果插入点击现有goals,或者保留,您希望fid值增加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是关键,如果重复{{1},您的请求会删除playergoalscompleted字段(并更新时间戳)传递。

这对我来说似乎是一件不合时宜的事情,但你肯定有自己的理由。

我也想知道为什么在创建新记录时不更新时间戳,但这不是你问题的对象......

所以基本上你有三种可能性:

1)在任何情况下将fid设置为新目标+ 10

这需要调整神秘缓冲区的内容,将新目标值加10。

您的代码无需其他修改即可使用。

2)将goals设置为新记录的新值,并将旧记录设置为相同的新值+ 10

goals

3)将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() 设置为新记录的新值,并将旧目标值增加10作为旧记录

goals

由于我无法理解此查询的目的是什么,因此我将为您提供解决方案的选择。

答案 1 :(得分: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知识回答了这个问题所以我有一种感觉我错过了一些东西,所以感谢至少尝试一下这个想法,请让我知道这是否真的没有回答这个问题。

答案 2 :(得分: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()");

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