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)!