Mysql 选择值然后更新

Posted

技术标签:

【中文标题】Mysql 选择值然后更新【英文标题】:Mysql Select value then update 【发布时间】:2013-04-20 08:57:52 【问题描述】:

基本上我想要做的是从表中获取一个回合 id,但是在返回值之后,它需要增加 1。在增加 10 次后,它会重置为 0;

所以我想做一些类似的事情,但我似乎无法让它工作:

UPDATE `gan` SET `turn` = (SELECT `turn` FROM `gan` WHERE `gan_id`='$gan_id') + 1

我还没有弄清楚如何检查该值是否为 10 以将其重置为 0;

所以我需要做的是,在我的 php mysql 查询中,为我传入的 gan_id 返回当前轮次,并在返回值后将其递增。

我尝试运行两个单独的查询,但我遇到了多个用户轮到同一轮的问题。

【问题讨论】:

如果你想防止竞争条件,更新时锁定表。 【参考方案1】:
mysql_query("SET AUTOCOMMIT = 0");
mysql_query("START TRANSACTION");
$result = mysql_query("SELECT turn FROM gan WHERE gan_id = $gan_id FOR UPDATE");
$turn = mysql_fetch_array($result);
$someNewVal = $turn == 10 ? 0 : $turn + 1;
$resUpdate = mysql_query("UPDATE gan SET turn = $someNewVal WHERE gan_id = $gan_id");
mysql_query("SET AUTOCOMMIT = 1");
mysql_query("COMMIT");

没有?如果你想处理并发,你需要选择 FOR UPDATE。

【讨论】:

锁定表方法有效。我只是想知道性能成本是多少。我将尝试您发布 No Way 的 Transaction 方法。看看这是否更快。【参考方案2】:

试试这个查询:

UPDATE `gan` SET `turn` =(SELECT MAX(`turn`) FROM `gan` WHERE `gan_id`='$gan_id')+ 1)

这将增加值。

要检查该值并将其重置为 0,您必须锁定表,然后执行您的任务

【讨论】:

【参考方案3】:

使用CASE expression:

UPDATE gan
SET    turn = CASE turn WHEN 10 THEN 0 ELSE turn + 1 END
WHERE  gan_id = ?

或者IF() function:

UPDATE gan SET turn = IF(turn<10, turn+1, 0) WHERE gan_id = ?

【讨论】:

以上是关于Mysql 选择值然后更新的主要内容,如果未能解决你的问题,请参考以下文章

选择总和直到设定数量,然后更新mysql数据库中的字段

选择一个值,然后在 c# 的同一查询中更新该值

MySQL按值选择计数

Jquery自动完成不使用选择更新输入值

mysql UPDATE 语句 - 相同值的开销?

mysql 批量更新还是单条更新如何选择