2013-04-20 110 views
1

基本上我试图做的是从表中获得一个转向标识,但是在返回值之后,它需要增加1.在10个增量后,它重置为0;Mysql选择值,然后更新

所以我希望做的做类似这样的东西,但我似乎无法得到它的工作:

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

我还没有想出如何检查,如果值为10将其重置0;

所以我需要发生的事情,在我的php mysql查询中,返回当前的gan_id,我传入并在值返回后递增。

我试过运行两个单独的查询,但我遇到了多个用户正在得到相同转向的问题。

+0

如果你想防止竞争的条件下,锁定表更新时。 – tyteen4a03 2013-04-20 09:00:42

回答

0

尝试此查询:

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

这将增加数值。

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

2
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。

+0

锁定表格的方法工作。我只是想知道性能成本。我将尝试您发布No Way的交易方法。看看这是否更快。 – 2013-04-20 09:22:26

0

使用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 = ?