您的位置:首页 > 其它

LAST_INSERT_ID() LAST_INSERT_ID(expr)

2011-11-30 11:26 260 查看
LAST_INSERT_ID()LAST_INSERT_ID(expr)

自动返回最后一个INSERT或UPDATE问询为AUTO_INCREMENT列设置的第一个发生的值。

mysql>SELECTLAST_INSERT_ID();

->195

产生的ID每次连接后保存在服务器中。这意味着函数向一个给定客户端返回的值是该客户端产生对影响AUTO_INCREMENT列的最新语句第一个AUTO_INCREMENT值的。这个值不能被其它客户端影响,即使它们产生它们自己的AUTO_INCREMENT值。这个行为保证了你能够找回自己的ID而不用担心其它客户端的活动,而且不需要加锁或处理。

假如你使用一个非“magic”值来更新某一行的AUTO_INCREMENT列,则LAST_INSERT_ID()的值不会变化(换言之,一个不是NULL也不是0的值)。

重点:假如你使用单INSERT语句插入多个行,LAST_INSERT_ID()只返回插入的第一行产生的值。其原因是这使依靠其它服务器复制同样的INSERT语句变得简单。

例如:

mysql>USEtest;

Databasechanged

mysql>CREATETABLEt(

->idINTAUTO_INCREMENTNOTNULLPRIMARYKEY,

->nameVARCHAR(10)NOTNULL

->);

QueryOK,0rowsaffected(0.09sec)


mysql>INSERTINTOtVALUES(NULL,'Bob');

QueryOK,1rowaffected(0.01sec)


mysql>SELECT*FROMt;

+----+------+

|id|name|

+----+------+

|1|Bob|

+----+------+

1rowinset(0.01sec)


mysql>SELECTLAST_INSERT_ID();

+------------------+

|LAST_INSERT_ID()|

+------------------+

|1|

+------------------+

1rowinset(0.00sec)


mysql>INSERTINTOtVALUES

->(NULL,'Mary'),(NULL,'Jane'),(NULL,'Lisa');

QueryOK,3rowsaffected(0.00sec)

Records:3Duplicates:0Warnings:0


mysql>SELECT*FROMt;

+----+------+

|id|name|

+----+------+

|1|Bob|

|2|Mary|

|3|Jane|

|4|Lisa|

+----+------+

4rowsinset(0.01sec)


mysql>SELECTLAST_INSERT_ID();

+------------------+

|LAST_INSERT_ID()|

+------------------+

|2|

+------------------+

1rowinset(0.00sec)

虽然第二个问询将3个新行插入t,对这些行的第一行产生的ID为2,这也是LAST_INSERT_ID()返回的值。

假如你使用INSERTIGNORE而记录被忽略,则AUTO_INCREMENT计数器不会增量,而LAST_INSERT_ID()返回0,这反映出没有插入任何记录。

若给出作为到LAST_INSERT_ID()的参数expr,则参数的值被函数返回,并作为被LAST_INSERT_ID()返回的下一个值而被记忆。这可用于模拟序列:

创建一个表,用来控制顺序计数器并使其初始化:

omysql>CREATETABLEsequence(idINTNOTNULL);

omysql>INSERTINTOsequenceVALUES(0);

使用该表产生这样的序列数:

omysql>UPDATEsequenceSETid=LAST_INSERT_ID(id+1);

omysql>SELECTLAST_INSERT_ID();

UPDATE语句会增加顺序计数器并引发向LAST_INSERT_ID()的下一次调用,用来返回升级后的值。SELECT语句会检索这个值。mysql_insert_id()CAPI函数也可用于获取这个值。见25.2.3.36节,“mysql_insert_id()”.

你可以不用调用LAST_INSERT_ID()而产生序列,但这样使用这个函数的效用在于ID值被保存在服务器中,作为自动产生的值。它适用于多个用户,原因是多个用户均可使用UPDATE语句并用SELECT语句(或mysql_insert_id()),得到他们自己的序列值,而不会影响其它产生他们自己的序列值的客户端或被其它产生他们自己的序列值的客户端所影响。

注意,mysql_insert_id()仅会在INSERT和UPDATE语句后面被升级,因此你不能在执行了其它诸如SELECT或SET这样的SQL语句后使用CAPI函数来找回LAST_INSERT_ID(expr)对应的值。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: