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 选择值然后更新的主要内容,如果未能解决你的问题,请参考以下文章