MYSQL獲取更新行的主鍵ID 【轉】

在某些狀況下咱們須要向數據表中更新一條記錄的狀態,而後再把它取出來,但這時若是你在更新前並無一個確認唯一記錄的主鍵就沒有辦法知道哪條記錄被更新了。html

 

舉例說明下:mysql

有一個發放新手卡的程序,設計數據庫時常見的方案有兩種:sql

方案一:使用一張表,新手卡和領取記錄都在一塊兒,這樣主要字段就是新手卡(主鍵)、用戶ID(唯一)、領取狀態(非必要)等數據庫

這樣的話數據庫操做就簡單了,直接一條update sql,將用戶id更新到這張表裏,而後根據用戶ID再select出來就行了。但這樣記錄不少時就會有效率的問題,暫不討論。併發

方案二:使用兩張表,一張存放新手卡,另一張存放領取記錄。新手卡表裏面有新手卡(主鍵)、新手卡狀態等字段。高併發

在操做時也能夠有兩種方式:ui

一是先重新手卡表中select出一條記錄,而後去更新它的狀態,再以後插入到領取記錄表中。spa

但這種方式最大的問題在於高併發狀況下,會出現多個用戶select出了同一條記錄,這樣就只能有一我的成功,其餘人會失敗。設計

二是先重新手卡中更新一條記錄,而後取出這條記錄插入到領取記錄表中。因爲是先update再select因此很好適應高併發的狀況,code

可是如今就遇到前面說的問題了:怎樣獲取剛纔更新記錄的ID呢?

下面代碼是從stackoverflow上找到的答案,借用一下:

SET @update_id := 0; UPDATE some_table SET row = 'value', id = (SELECT @update_id := id) WHERE some_other_row = 'blah' LIMIT 1; SELECT @update_id;

大體思路就是首先聲明一個用戶變量 @update_id ,以後在update數據時要多更新一個字段,就是將當前主鍵值更新爲當前主鍵值(其實就是沒更新),更新主鍵字段並非目的,只是爲了將當前主鍵值賦值給@update_id,就是這句: ( SELECT @update_id := id )。 (我的理解,水平有限可能會有出入)

另外若是更新了多條記錄也能夠用下面的方式

 

SET @uids := null; UPDATE footable SET foo = 'bar' WHERE fooid > 5 AND ( SELECT @uids := CONCAT_WS(',', fooid, @uids) ); SELECT @uids;

 

 

注:上面的方法不適用於有HAVING、GROUP BY或者ORDER BY子句中,不然可能出入與預期不一樣的結果。

參考官方手冊說明 http://dev.mysql.com/doc/refman/5.1/zh/language-structure.html

相關文章
相關標籤/搜索