2013-04-20 94 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 = ?