2014-09-22 897 views
0

對不起,如果問題看起來很奇怪而且很愚蠢,但是我需要知道它是可能的還是什麼。在mysql中運行更新查詢後返回更新後的值

因此 我有以下查詢更新請求表中的請求記錄的狀態。

$updateQ = "UPDATE requests SET status = status+1 WHERE rid = '$rid'"; 
if($this->db->query($updateQ)) 
    return $this->db->select('status')->from('requests')->where('rid', $rid)->get()->row('status'); 

我不知道我是否可以在執行查詢,而不運行的另一個選擇查詢後立即得到更新狀態字段的值。

+0

不,你不能得到它,在更新後,你可以得到的唯一的事情是受影響行,這是'1' – Ghost 2014-09-22 08:44:14

回答

1

不,你不能。我不明白,爲什麼你擔心它。我猜,rid是你的主要關鍵。之後的SELECT應該如此之快,以至於你幾乎不會注意到它。

+0

在跨國數據庫中,這是不可靠的,直到你確定它是原子 – karmendra 2015-12-04 13:37:39

+0

@ka rmendra我認爲你在這裏弄混了一些東西。問題是,如果他能得到更新的值**而不運行另一個選擇查詢**。這不是關於價值是否由另一筆交易再次改變。實際上,[這種更新語句是安全的](http://stackoverflow.com/questions/3821468/sql-atomic-increment-and-locking-strategies-is-this-safe)。所以我的回答沒有錯。 – fancyPants 2015-12-04 14:29:20

+0

好吧,我同意,但我無法收回我的反對票,直到你編輯你的答案。 – karmendra 2015-12-04 14:47:37

1

您應該使用SELECT FOR UPDATE(for mySQL)或類似的東西來實現更新和選擇最後一個值的原子性。

SELECT counter_field FROM child_codes FOR UPDATE; 
UPDATE child_codes SET counter_field = counter_field + 1; 

或使用LAST_INSERT_ID()如果您希望獲取上次插入的ID以進行更新。

UPDATE counters 
SET value = LAST_INSERT_ID(value) + 1 
WHERE id = 1; 

然後

SELECT LAST_INSERT_ID(); 

讀通select-update-single-statement-race-condition

感謝, ķ

+0

這是一般**的良好信息**,但在這種情況下並非真正必要。無論如何,upvote。 – fancyPants 2015-12-04 14:52:13