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

Mysql關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng)

mysql是一個(gè)開(kāi)放源碼的小型關(guān)聯(lián)式數(shù)據(jù)庫(kù)管理系統(tǒng),開(kāi)發(fā)者為瑞典mysql ab公司。mysql被廣泛地應(yīng)用在internet上的中小型網(wǎng)站中。由于其體積小、速度快、總體擁有成本低,尤其是開(kāi)放源碼這一特點(diǎn),許多中小型網(wǎng)站為了降低網(wǎng)站總體擁有成本而選擇了mysql作為網(wǎng)站數(shù)據(jù)庫(kù)。

相信大家應(yīng)該都知道Mysql函數(shù)可以實(shí)現(xiàn)許多我們需要的功能,這篇文章介紹的Mysql函數(shù)Last_insert_id()就是其中之一,文章通過(guò)一個(gè)例子展開(kāi)來(lái)講,應(yīng)該更有助于大家的理解和學(xué)習(xí),有需要的朋友們下面來(lái)一起看看吧。

前言

最近一個(gè)同事問(wèn)我,為什么last_insert_id()得到的結(jié)果與預(yù)期的不一樣呢,于是我就認(rèn)真的去研究的一下這個(gè)參數(shù),下面是關(guān)于last_insert_id()的詳細(xì)介紹,一起來(lái)學(xué)習(xí)學(xué)習(xí)吧。

首先,舉個(gè)例子

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)  #?沒(méi)有指定值的時(shí)候,last_insert_id()符合預(yù)期希望  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?不是應(yīng)該是5么,為什么是第一個(gè)插入的值3?last_insert_id開(kāi)始有一點(diǎn)不符合預(yù)期了。。  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)  #?納尼?按照預(yù)期不是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

官方文檔原話(huà):

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.

翻譯:

沒(méi)有參數(shù)的last_insert_id()返回的是最近一次針對(duì)autoincrement列執(zhí)行的INSERT語(yǔ)句的第一個(gè)自動(dòng)生成的值。

官方文檔原話(huà):

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語(yǔ)句中插入多個(gè)值,那么last_insert_id()返回的是該INSERT語(yǔ)句第一個(gè)自動(dòng)生成的值。

然后,剖析一下

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

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

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

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

官方文檔明明說(shuō)了,是最近一次的INSERT語(yǔ)句**自動(dòng)生成的第一個(gè)值**哇哇哇。。

總結(jié)

記住last_insert_id()的約束。最近一次INSERT語(yǔ)句在autpincrement列上自動(dòng)生成的第一個(gè)值。總結(jié)的這句話(huà)比翻譯的那句話(huà)感覺(jué)順口多了==

好了,以上就是這篇文章的全部?jī)?nèi)容了,更多相關(guān)內(nèi)容請(qǐng)關(guān)注PHP中文網(wǎng)(www.php.cn)!

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點(diǎn)贊9 分享