@@IDENTITY 返回最后一个插入 IDENTITY 的值,这些操做包括:INSERT, SELECT INTO,或者 bulk copy。若是在给没有 IDENTITY 列的其余表插入记录,系统将其置为 null。若是有多行记录插入到 IDENTITY 表中,@@IDENTITY 表示最后一个产生的值。若是触发了某个触发器,而且这个触发器执行向另外一个带有 IDENTITY 列的表的插入操做,@@IDENTITY 将返回这个由触发器产生的值。若是这个触发器插入的表中不包含 IDENTITY 列,那么 @@IDENTITY 将为 null。若是插入操做失败,@@IDENTITY 值依然会增长,因此 IDENTITY 不保证数据的连续性。sql
从自己用法是没有什么区别的。
惟一区别的@@identity是sql server ,而last_insert_id()
是my sql,identity是跟last_insert_id的区别是若是出现insert多条记录的时候,一个是取这个事务的最前面的哪一个,一个是取这个事务的最后一个.
last_insert_id()是取数据最后一下。而@@identity是顺序取数据的数据库
看到了吧!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 是能够的。ide
但在多线程状况下,就不行了。在多用户交替插入数据的状况下max(id)显然不能用。函数
这就该使用LAST_INSERT_ID了,由于LAST_INSERT_ID是基于Connection的,只要每一个线程都使用独立的Connection对象,LAST_INSERT_ID函数将返回该Connection对AUTO_INCREMENT列最新的insert or update操做生成的第一个record的ID。这个值不能被其它客户端(Connection)影响,保证了你可以找回本身的 ID 而不用担忧其它客户端的活动,并且不须要加锁。线程