使用C 在列中的现有SQL值中添加值

Adding a value to an existing SQL value in a column using C++

本文关键字:添加 SQL 使用      更新时间:2023-10-16

我将如何使此代码摘要添加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,或者保留 old> old 值,则您是否希望goals的新值逐渐增加10。br>还是您想在两种情况下都放置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)将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()

由于我无法理解此查询的目的,因此我会选择解决方案。

如果我理解问题,那么这应该可以起作用,我对问题中使用的代码并不完全熟悉,但我觉得我明白您要做什么。

为什么不将其分解为两个不同的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知识回答了这个问题,所以我感觉自己缺少某些东西,因此,请至少尝试一下这个想法,请告诉我是否真的没有回答这个问题。

this:

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脚本中,它在引号内。