輕松掌握MySQL函數中的last_insert_id()

Mysql關系型數據庫管理系統

mysql是一個開放源碼的小型關聯式數據庫管理系統,開發者為瑞典mysql ab公司。mysql被廣泛地應用在internet上的中小型網站中。由于其體積小、速度快、總體擁有成本低,尤其是開放源碼這一特點,許多中小型網站為了降低網站總體擁有成本而選擇了mysql作為網站數據庫。

相信大家應該都知道Mysql函數可以實現許多我們需要的功能,這篇文章介紹的Mysql函數Last_insert_id()就是其中之一,文章通過一個例子展開來講,應該更有助于大家的理解和學習,有需要的朋友們下面來一起看看吧。

前言

最近一個同事問我,為什么last_insert_id()得到的結果與預期的不一樣呢,于是我就認真的去研究的一下這個參數,下面是關于last_insert_id()的詳細介紹,一起來學習學習吧。

首先,舉個例子

wing@3306>show?create?table?tt;  +-------+-----------------------------------------------------------------------------------------------------------------------+  |?Table?|?Create?Table???????????????????????????|  +-------+-----------------------------------------------------------------------------------------------------------------------+  |?tt?|?CREATE?TABLE?`tt`?(  ?`id`?int(11)?NOT?NULL?AUTO_INCREMENT,  ?PRIMARY?KEY?(`id`)  )?ENGINE=InnoDB?DEFAULT?CHARSET=utf8?|  +-------+-----------------------------------------------------------------------------------------------------------------------+  1?row?in?set?(0.00?sec)  #?沒有指定值的時候,last_insert_id()符合預期希望  wing@3306>insert?into?tt?values();  Query?OK,?1?row?affected?(0.00?sec)  wing@3306>select?last_insert_id();  +------------------+  |?last_insert_id()?|  +------------------+  |????1?|  +------------------+  1?row?in?set?(0.00?sec)  wing@3306>insert?into?tt?values();  Query?OK,?1?row?affected?(0.00?sec)  wing@3306>select?last_insert_id();  +------------------+  |?last_insert_id()?|  +------------------+  |????2?|  +------------------+  1?row?in?set?(0.00?sec)  #?what?不是應該是5么,為什么是第一個插入的值3?last_insert_id開始有一點不符合預期了。。  wing@3306>insert?into?tt?values(),(),();  Query?OK,?3?rows?affected?(0.01?sec)  Records:?3?Duplicates:?0?Warnings:?0  wing@3306>select?last_insert_id();  +------------------+  |?last_insert_id()?|  +------------------+  |????3?|  +------------------+  1?row?in?set?(0.00?sec)  wing@3306>insert?into?tt?values(),(),();  Query?OK,?3?rows?affected?(0.01?sec)  Records:?3?Duplicates:?0?Warnings:?0  wing@3306>select?last_insert_id();  +------------------+  |?last_insert_id()?|  +------------------+  |????6?|  +------------------+  1?row?in?set?(0.00?sec)  #?納尼?按照預期不是10么?為什么還是之前的6?last_insert_id()我不懂你啊。。  wing@3306>insert?into?tt?values(10);  Query?OK,?1?row?affected?(0.01?sec)  wing@3306>select?last_insert_id();  +------------------+  |?last_insert_id()?|  +------------------+  |????6?|  +------------------+  1?row?in?set?(0.00?sec)

其次,研究一下

查閱MySQL官方文檔,真的太重要了。。。

官方出處:http://dev.mysql.com/doc/refman/5.6/en/information-functions.html#function_last-insert-id

官方文檔原話:

With?no?argument,?LAST_INSERT_ID()?returns?a?64-bit?value?representing?the?first?automatically?generated?value?successfully?  inserted?for?an?AUTO_INCREMENT?column?as?a?result?of?the?most?recently?executed?INSERT?statement.

翻譯:

沒有參數的last_insert_id()返回的是最近一次針對autoincrement列執行的INSERT語句的第一個自動生成的值。

官方文檔原話:

If?you?insert?multiple?rows?using?a?single?INSERT?statement,?LAST_INSERT_ID()?returns?the?value?generated?for?the?  first?inserted?row?only.?The?reason?for?this?is?to?make?it?possible?to?reproduce?easily?the?same?INSERT?statement?against?some?other?server.

翻譯:

如果你在單條INSERT語句中插入多個值,那么last_insert_id()返回的是該INSERT語句第一個自動生成的值。

然后,剖析一下

請認真閱讀上述翻譯中的黑色字體,牢記last_insert_id()的約束。

為什么插入指定的值,last_insert_id()就失效了呢?

官方文檔明明說了,是自動生成的值啊,不是你指定的值啊,是由autoincremnt計數器自己生成的才能被last_insert_id()追蹤到哇。。

為什么多值插入的時候,顯示的是第一條插入值啊,last不是最后一個值的意思么啊啊啊。。

官方文檔明明說了,是最近一次的INSERT語句**自動生成的第一個值**哇哇哇。。

總結

記住last_insert_id()的約束。最近一次INSERT語句在autpincrement列上自動生成的第一個值。總結的這句話比翻譯的那句話感覺順口多了==

好了,以上就是這篇文章的全部內容了,更多相關內容請關注PHP中文網(www.php.cn)!

? 版權聲明
THE END
喜歡就支持一下吧
點贊9 分享