日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql 获取 row的id_转: MYSQL获取更新行的主键ID

發(fā)布時間:2025/4/5 数据库 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql 获取 row的id_转: MYSQL获取更新行的主键ID 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

在某些情況下我們需要向數(shù)據(jù)表中更新一條記錄的狀態(tài),然后再把它取出來,但這時如果你在更新前并沒有一個確認惟一記錄的主鍵就沒有辦法知道哪條記錄被更新了。

舉例說明下:

有一個發(fā)放新手卡的程序,設(shè)計數(shù)據(jù)庫時常見的方案有兩種:

方案一:使用一張表,新手卡和領(lǐng)取記錄都在一起,這樣主要字段就是新手卡(主鍵)、用戶ID(惟一)、領(lǐng)取狀態(tài)(非必要)等

這樣的話數(shù)據(jù)庫操作就簡單了,直接一條update sql,將用戶id更新到這張表里,然后根據(jù)用戶ID再select出來就好了。但這樣記錄很多時就會有效率的問題,暫不討論。

方案二:使用兩張表,一張存放新手卡,另外一張存放領(lǐng)取記錄。新手卡表里面有新手卡(主鍵)、新手卡狀態(tài)等字段。

在操作時也可以有兩種方式:

一是先從新手卡表中select出一條記錄,然后去更新它的狀態(tài),再之后插入到領(lǐng)取記錄表中。

但這種方式最大的問題在于高并發(fā)情況下,會出現(xiàn)多個用戶select出了同一條記錄,這樣就只能有一個人成功,其他人會失敗。

二是先從新手卡中更新一條記錄,然后取出這條記錄插入到領(lǐng)取記錄表中。由于是先update再select所以很好適應(yīng)高并發(fā)的情況,

但是現(xiàn)在就遇到前面說的問題了:怎樣獲取剛才更新記錄的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數(shù)據(jù)時要多更新一個字段,就是將當前主鍵值更新為當前主鍵值(其實就是沒更新),更新主鍵字段并不是目的,只是為了將當前主鍵值賦值給@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子句中,否則可能出入與預(yù)期不同的結(jié)果。

轉(zhuǎn)自: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函數(shù)可以實現(xiàn)許多我們需要的功能,下面介紹的Mysql函數(shù)Last_insert_id()就是其中之一,希望對您學習Mysql函數(shù)能有所幫助。

自動返回最后一個INSERT或 UPDATE 查詢中 AUTO_INCREMENT列設(shè)置的第一個表發(fā)生的值。

1. mysql> SELECT LAST_INSERT_ID();

2. -> 195

產(chǎn)生的ID 每次連接后保存在服務(wù)器中。這意味著函數(shù)向一個給定客戶端返回的值是該客戶端產(chǎn)生對影響AUTO_INCREMENT列的最新語句第一個AUTO_INCREMENT值的。這個值不能被其它客戶端影響,即它們產(chǎn)生它們自己的AUTO_INCREMENT值。這個行為保證了你能夠找回自己的 ID 而不用擔心受其它客戶端的影響力,而且不需要加鎖處理。

假如你使用一個非“magic”值來更新某一行的AUTO_INCREMENT 列,則LAST_INSERT_ID() 的值不會變化(換言之, 一個不是 NULL也不是 0的值)。

重點: 假如你使用一條INSERT語句插入多個行, LAST_INSERT_ID() 只返回插入的第一行數(shù)據(jù)時產(chǎn)生的值。其原因是這使依靠其它服務(wù)器復制同樣的 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, 對這些行的第一行產(chǎn)生的 ID 為 2, 這也是 LAST_INSERT_ID() 返回的值

假如使用 INSERT IGNORE而記錄被忽略,則AUTO_INCREMENT 計數(shù)器不會增量,而 LAST_INSERT_ID() 返回0, 這反映出沒有插入任何記錄。

=常用用法=============================================

若給出作為到LAST_INSERT_ID()的參數(shù)expr?,則參數(shù)的值被函數(shù)返回,并作為被LAST_INSERT_ID()返回的下一個值而被記憶。這可用于模擬序列:

創(chuàng)建一個表,用來控制順序計數(shù)器并使其初始化:

mysql> CREATE TABLE sequence (id INT NOT NULL);

mysql> INSERT INTO sequence VALUES (0);

使用該表產(chǎn)生這樣的序列數(shù) :

mysql>?UPDATE sequence SET id=LAST_INSERT_ID(id+1);

mysql>?SELECT LAST_INSERT_ID();

->1;UPDATE?語句會增加順序計數(shù)器并引發(fā)向LAST_INSERT_ID()??的下一次調(diào)用,用來返回升級后的值。?SELECT?語句會檢索這個值。? mysql_insert_id() C API函數(shù)也可用于獲取這個值。

你可以不用調(diào)用LAST_INSERT_ID()而產(chǎn)生序列,但這樣使用這個函數(shù)的效用在于?ID值被保存在服務(wù)器中,作為自動產(chǎn)生的值。它適用于多個用戶,原因是多個用戶均可使用?UPDATE語句并用SELECT語句(或mysql_insert_id()),得到他們自己的序列值,而不會影響其它產(chǎn)生他們自己的序列值的客戶端或被其它產(chǎn)生他們自己的序列值的客戶端所影響。

注意,?mysql_insert_id()?僅會在INSERT?和UPDATE語句后面被升級, 因此你不能在執(zhí)行了其它諸如SELECT或?SET?這樣的SQL語句后使用?C API?函數(shù)來找回?LAST_INSERT_ID(expr)?對應(yīng)的值。

更多:

http://blog.chinaunix.net/uid-167175-id-3981768.html

原文:http://www.cnblogs.com/youxin/p/4533924.html

總結(jié)

以上是生活随笔為你收集整理的mysql 获取 row的id_转: MYSQL获取更新行的主键ID的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。