mysql last_insert_id() (转载)

摘要:
last_insert_id()函数的返回值不基于整个数据库的insert语句。使用auto_增量类型的id字段用作表的主键。通过在连接1中执行select和在连接2_INSERT_ID()中执行selectLAST获得的结果不同:使用SCOPE_IDENTITY()将当前会话的值插入到IDENTITY字段中。

先来看看官方的说明

  1. The ID that was generated is maintained in the server on a per-connection basis. This means that the value returned by the function to a given client is the first AUTO_INCREMENT value generated for most recent statement affecting an AUTO_INCREMENT column by that client. This value cannot be affected by other clients, even if they generate AUTO_INCREMENT values of their own. This behavior ensures that each client can retrieve its own ID without concern for the activity of other clients, and without the need for locks or transactions.  

看到了吧!last_insert_id()函数的返回值不是基于整个数据库的插入语句,
而是基于单个连接客户端之间所执行的insert语句最近一条,而且客户端之间是不会影响的,它是连接级别的函数,只对当前用户的连接有效。

=============================================================

以下文章来源于网络

在MySQL中,使用auto_increment类型的id字段作为表的主键。
通常的做法,是通过“select max(id) from tablename”的做法,但是显然这种做法需要考虑并发的情况,需要在事务中对主表加以“X锁“,待获得max(id)的值以后,再解锁。
这种做法需要的步骤比较多,有些麻烦,而且并发性也不好。有没有更简单的做法呢?答案之一是通过select LAST_INSERT_ID()这个操作。
乍一看,它和select max(id)很象,但实际上它是线程安全的。也就是说它是具体于数据库连接的。下面通过实验说明:
(1)、在连接1中向A表插入一条记录,A表包含一个auto_increment类型的字段。
(2)、在连接2中向A表再插入一条记录。
(3)、结果:在连接1中执行select 得到的结果和连接2中执行select LAST_INSERT_ID()的结果是不同的;而在两个连接中执行select max(id)的结果是相同的。LAST_INSERT_ID()
其实在MSSQL中SCOPE_IDENTITY()和IDENT_CURRENT()的区别和这里是类似的。使用SCOPE_IDENTITY()可以获得插入某个IDENTITY字段的当前会话的值,而使用IDENT_CURRENT()会获得在某个IDENTITY字段上插入的最大值,而不区分不同 的会话。
注:使用select last_insert_id()时要注意,当一次插入多条记录时,只是获得第一次插入的id值,务必注意!
 

LAST_INSERT_ID 是与table无关的,如果向表a插入数据后,再向表b插入数据,LAST_INSERT_ID会改变。

一般情况下获取刚插入的数据的id,使用select max(id) from table 是可以的。

但在多线程情况下,就不行了。在多用户交替插入数据的情况下max(id)显然不能用。

这就该使用LAST_INSERT_ID了,因为LAST_INSERT_ID是基于Connection的,只要每个线程都使用独立的Connection对象,LAST_INSERT_ID函数将返回该Connection对AUTO_INCREMENT列最新的insert or update操作生成的第一个record的ID。这个值不能被其它客户端(Connection)影响,保证了你能够找回自己的 ID 而不用担心其它客户端的活动,而且不需要加锁。

出处:http://sucre.blog.51cto.com/1084905/723808,如果你也想转载可别忘了加出处,不然这哥们要追究你法律责任的……

免责声明:文章转载自《mysql last_insert_id() (转载)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇memcached缓存批量更新解决方案探讨ansible批量修改linux服务器密码的playbook下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

使用TSQL的Rand函数生成随机数的艰苦历程

在上一篇《大量数据插入的几种方式的速度比较》里,有一列数据是用Rank函数来生产的,用来造假数据。 现在的问题是,如果要更新这一列的值,怎么办呢?也许全部删除,重新插入一遍就可以。但是太慢了。于是随手就写出了下面的代码。   Update aTable Set aColumn = @MaxInt *RAND()   结果完全出乎意料,这一列的值全是一样的!...

appium 元素定位

元素定位 工具介绍 1.appium 自带组件定位元素 1.1 启动appium 点开组件  2.用android SDK 自带的uiautomator 3.元素定位 与Web自动化测试一样,app自动化测试过程中最重要一个环节就是元素定位,只有准确定位到了元素才能进行相关元素的操作,如输入、点击、拖拽、滑动等。appium提供了许多元素定位的方法,...

_nop_();

C语言中没有_nop_()函数。 在51C中一般包含在#include “intrins.h” 头文件中。 该函数是在51单片机中用的延时函数,表示执行一条没有什么意义的指令,延时一个指令周期,有的指令周期是两个或两个以上的机械周期,但是_nop_();指令需要的只是一个机械周期也就是12个时钟周期(震荡周期)。 51单片机中,1个机械周期 = 12个时钟...

在Hibernate中使用Oracle的sequence主键

在Oracle中建立sequence,名称为pk:create sequence pk    start with 1    increment by 1    maxvalue 2000    nocycle    cache 30;在映射文件中修改:<class name="com.kay.pojo.Student" table="STUDENT...

反调试:IsDebuggerPresent

前言:一个反调试IsDebuggerPresent的CreackMe IsDebuggerPresent函数的了解: IsDebuggerPresent 作用 确定调用进程是否由用户模式的调试器调试。 语法 BOOL WINAPI IsDebuggerPresent(void); 参数 该函数没有参数 返回值 如果当前进程运...

VC++或QT下 高精度 多媒体定时器

在VC编程中,用SetTimer可以定义一个定时器,到时间了,就响应OnTimer消息,但这种定时器精度太低了。如果需要精度更高一些的定时器(精 确到1ms),可以使用下面的高精度多媒体定时器进行代码优化,可以达到毫秒级的精度,而且使用方便。先要包含头文件"mmsystem.h"和库文 件"winmm.lib"。  虽然Win95下可视化开发工具如VC、D...