【问题标题】:Mysql Select value then updateMysql 选择值然后更新
【发布时间】: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 返回当前轮次,并在返回值后将其递增。

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

【问题讨论】:

  • 如果你想防止竞争条件,更新时锁定表。

标签: php mysql sql mysqli


【解决方案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 = ?
    

    【讨论】:

      猜你喜欢
      • 2014-09-01
      • 2014-08-26
      • 2016-06-27
      • 2021-01-04
      • 1970-01-01
      • 2013-10-15
      • 1970-01-01
      • 1970-01-01
      • 2018-01-24
      相关资源
      最近更新 更多