轻松掌握MySQL函数中的last_insert_id()
前言
最近一个同事问我,为什么last_insert_id()得到的结果与预期的不一样呢,于是我就认真的去研究的一下这个参数,下面是关于last_insert_id()的详细介绍,一起来学习学习吧。
首先,举个例子
wing@3306>showcreatetablett; +-------+-----------------------------------------------------------------------------------------------------------------------+ |Table|CreateTable| +-------+-----------------------------------------------------------------------------------------------------------------------+ |tt|CREATETABLE`tt`( `id`int(11)NOTNULLAUTO_INCREMENT, PRIMARYKEY(`id`) )ENGINE=InnoDBDEFAULTCHARSET=utf8| +-------+-----------------------------------------------------------------------------------------------------------------------+ 1rowinset(0.00sec) #没有指定值的时候,last_insert_id()符合预期希望 wing@3306>insertintottvalues(); QueryOK,1rowaffected(0.00sec) wing@3306>selectlast_insert_id(); +------------------+ |last_insert_id()| +------------------+ |1| +------------------+ 1rowinset(0.00sec) wing@3306>insertintottvalues(); QueryOK,1rowaffected(0.00sec) wing@3306>selectlast_insert_id(); +------------------+ |last_insert_id()| +------------------+ |2| +------------------+ 1rowinset(0.00sec) #what?不是应该是5么,为什么是第一个插入的值3?last_insert_id开始有一点不符合预期了。。 wing@3306>insertintottvalues(),(),(); QueryOK,3rowsaffected(0.01sec) Records:3Duplicates:0Warnings:0 wing@3306>selectlast_insert_id(); +------------------+ |last_insert_id()| +------------------+ |3| +------------------+ 1rowinset(0.00sec) wing@3306>insertintottvalues(),(),(); QueryOK,3rowsaffected(0.01sec) Records:3Duplicates:0Warnings:0 wing@3306>selectlast_insert_id(); +------------------+ |last_insert_id()| +------------------+ |6| +------------------+ 1rowinset(0.00sec) #纳尼?按照预期不是10么?为什么还是之前的6?last_insert_id()我不懂你啊。。 wing@3306>insertintottvalues(10); QueryOK,1rowaffected(0.01sec) wing@3306>selectlast_insert_id(); +------------------+ |last_insert_id()| +------------------+ |6| +------------------+ 1rowinset(0.00sec)
其次,研究一下
查阅MySQL官方文档,真的太重要了。。。
官方出处:http://dev.mysql.com/doc/refman/5.6/en/information-functions.html#function_last-insert-id
官方文档原话:
Withnoargument,LAST_INSERT_ID()returnsa64-bitvaluerepresentingthefirstautomaticallygeneratedvaluesuccessfullyinsertedforanAUTO_INCREMENTcolumnasaresultofthemostrecentlyexecutedINSERTstatement.
翻译:
没有参数的last_insert_id()返回的是最近一次针对autoincrement列执行的INSERT语句的第一个自动生成的值。
官方文档原话:
IfyouinsertmultiplerowsusingasingleINSERTstatement,LAST_INSERT_ID()returnsthevaluegeneratedforthefirstinsertedrowonly.ThereasonforthisistomakeitpossibletoreproduceeasilythesameINSERTstatementagainstsomeotherserver.
翻译:
如果你在单条INSERT语句中插入多个值,那么last_insert_id()返回的是该INSERT语句第一个自动生成的值。
然后,剖析一下
请认真阅读上述翻译中的黑色字体,牢记last_insert_id()的约束。
为什么插入指定的值,last_insert_id()就失效了呢?
官方文档明明说了,是自动生成的值啊,不是你指定的值啊,是由autoincremnt计数器自己生成的才能被last_insert_id()追踪到哇。。
为什么多值插入的时候,显示的是第一条插入值啊,last不是最后一个值的意思么啊啊啊。。
官方文档明明说了,是最近一次的INSERT语句**自动生成的第一个值**哇哇哇。。
总结
记住last_insert_id()的约束。最近一次INSERT语句在autpincrement列上自动生成的第一个值。总结的这句话比翻译的那句话感觉顺口多了==
好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。