mysql 获取 row的id_转: MYSQL获取更新行的主键ID
在某些情況下我們需要向數據表中更新一條記錄的狀態,然后再把它取出來,但這時如果你在更新前并沒有一個確認惟一記錄的主鍵就沒有辦法知道哪條記錄被更新了。
舉例說明下:
有一個發放新手卡的程序,設計數據庫時常見的方案有兩種:
方案一:使用一張表,新手卡和領取記錄都在一起,這樣主要字段就是新手卡(主鍵)、用戶ID(惟一)、領取狀態(非必要)等
這樣的話數據庫操作就簡單了,直接一條update sql,將用戶id更新到這張表里,然后根據用戶ID再select出來就好了。但這樣記錄很多時就會有效率的問題,暫不討論。
方案二:使用兩張表,一張存放新手卡,另外一張存放領取記錄。新手卡表里面有新手卡(主鍵)、新手卡狀態等字段。
在操作時也可以有兩種方式:
一是先從新手卡表中select出一條記錄,然后去更新它的狀態,再之后插入到領取記錄表中。
但這種方式最大的問題在于高并發情況下,會出現多個用戶select出了同一條記錄,這樣就只能有一個人成功,其他人會失敗。
二是先從新手卡中更新一條記錄,然后取出這條記錄插入到領取記錄表中。由于是先update再select所以很好適應高并發的情況,
但是現在就遇到前面說的問題了:怎樣獲取剛才更新記錄的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 >5AND (SELECT @uids:=CONCAT_WS(‘,‘,fooid,@uids));SELECT @uids;
注:上面的方法不適用于有HAVING、GROUP BY或者ORDER BY子句中,否則可能出入與預期不同的結果。
轉自:http://blog.csdn.net/rainday0310/article/details/25037295
stackoverflow問題:
http://stackoverflow.com/questions/1388025/how-to-get-id-of-the-last-updated-row-in-mysql
mysql last_insert_id
Mysql函數可以實現許多我們需要的功能,下面介紹的Mysql函數Last_insert_id()就是其中之一,希望對您學習Mysql函數能有所幫助。
自動返回最后一個INSERT或 UPDATE 查詢中 AUTO_INCREMENT列設置的第一個表發生的值。
1. mysql> SELECT LAST_INSERT_ID();
2. -> 195
產生的ID 每次連接后保存在服務器中。這意味著函數向一個給定客戶端返回的值是該客戶端產生對影響AUTO_INCREMENT列的最新語句第一個AUTO_INCREMENT值的。這個值不能被其它客戶端影響,即它們產生它們自己的AUTO_INCREMENT值。這個行為保證了你能夠找回自己的 ID 而不用擔心受其它客戶端的影響力,而且不需要加鎖處理。
假如你使用一個非“magic”值來更新某一行的AUTO_INCREMENT 列,則LAST_INSERT_ID() 的值不會變化(換言之, 一個不是 NULL也不是 0的值)。
重點: 假如你使用一條INSERT語句插入多個行, LAST_INSERT_ID() 只返回插入的第一行數據時產生的值。其原因是這使依靠其它服務器復制同樣的 INSERT語句變得簡單。
例如:
1. mysql> USE test;
2. Database changed
3. mysql> CREATE TABLE t (
4. -> id INT AUTO_INCREMENT NOT NULL PRIMARY KEY,
5. -> name VARCHAR(10) NOT NULL
6. -> );
7. Query OK, 0 rows affected (0.09 sec)
8.
9. mysql> INSERT INTO t VALUES (NULL, ‘Bob‘);
10. Query OK, 1 row affected (0.01 sec)
11.
12. mysql> SELECT * FROM t;
13. +----+------+
14. | id | name |
15. +----+------+
16. | 1 | Bob |
17. +----+------+
18. 1 row in set (0.01 sec)
19.
20. mysql> SELECT LAST_INSERT_ID();
21. +------------------+
22. | LAST_INSERT_ID() |
23. +------------------+
24. | 1 |
25. +------------------+
26. 1 row in set (0.00 sec)
27.
28. mysql> INSERT INTO t VALUES
29. -> (NULL, ‘Mary‘), (NULL, ‘Jane‘), (NULL, ‘Lisa‘);
30. Query OK, 3 rows affected (0.00 sec)
31. Records: 3 Duplicates: 0 Warnings: 0
32.
33. mysql> SELECT * FROM t;
34. +----+------+
35. | id | name |
36. +----+------+
37. | 1 | Bob |
38. | 2 | Mary |
39. | 3 | Jane |
40. | 4 | Lisa |
41. +----+------+
42. 4 rows in set (0.01 sec)
43.
44. mysql> SELECT LAST_INSERT_ID();//注意
45. +------------------+
46. | LAST_INSERT_ID() |
47. +------------------+
48. | 2 |
49. +------------------+
50. 1 row in set (0.00 sec)
51.
雖然第二個問詢將3 個新行插入 t, 對這些行的第一行產生的 ID 為 2, 這也是 LAST_INSERT_ID() 返回的值
假如使用 INSERT IGNORE而記錄被忽略,則AUTO_INCREMENT 計數器不會增量,而 LAST_INSERT_ID() 返回0, 這反映出沒有插入任何記錄。
=常用用法=============================================
若給出作為到LAST_INSERT_ID()的參數expr?,則參數的值被函數返回,并作為被LAST_INSERT_ID()返回的下一個值而被記憶。這可用于模擬序列:
創建一個表,用來控制順序計數器并使其初始化:
mysql> CREATE TABLE sequence (id INT NOT NULL);
mysql> INSERT INTO sequence VALUES (0);
使用該表產生這樣的序列數 :
mysql>?UPDATE sequence SET id=LAST_INSERT_ID(id+1);
mysql>?SELECT LAST_INSERT_ID();
->1;UPDATE?語句會增加順序計數器并引發向LAST_INSERT_ID()??的下一次調用,用來返回升級后的值。?SELECT?語句會檢索這個值。? mysql_insert_id() C API函數也可用于獲取這個值。
你可以不用調用LAST_INSERT_ID()而產生序列,但這樣使用這個函數的效用在于?ID值被保存在服務器中,作為自動產生的值。它適用于多個用戶,原因是多個用戶均可使用?UPDATE語句并用SELECT語句(或mysql_insert_id()),得到他們自己的序列值,而不會影響其它產生他們自己的序列值的客戶端或被其它產生他們自己的序列值的客戶端所影響。
注意,?mysql_insert_id()?僅會在INSERT?和UPDATE語句后面被升級, 因此你不能在執行了其它諸如SELECT或?SET?這樣的SQL語句后使用?C API?函數來找回?LAST_INSERT_ID(expr)?對應的值。
更多:
http://blog.chinaunix.net/uid-167175-id-3981768.html
原文:http://www.cnblogs.com/youxin/p/4533924.html
總結
以上是生活随笔為你收集整理的mysql 获取 row的id_转: MYSQL获取更新行的主键ID的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql 子查询添加索引_mysql
- 下一篇: java list类型参数_java –