zoukankan      html  css  js  c++  java
  • 如何在mssql中获取最新自增ID的值

    @@IDENTITY 返回最后一个插入 IDENTITY 的值,这些操作包括:INSERT, SELECT INTO,或者 bulk copy。如果在给没有 IDENTITY 列的其他表插入记录,系统将其置为 null。如果有多行记录插入到 IDENTITY 表中,@@IDENTITY 表示最后一个产生的值。如果触发了某个触发器,并且这个触发器执行向另一个带有 IDENTITY 列的表的插入操作,@@IDENTITY 将返回这个由触发器产生的值。如果这个触发器插入的表中不包含 IDENTITY 列,那么 @@IDENTITY 将为 null。如果插入操作失败,@@IDENTITY 值依然会增加,所以 IDENTITY 不保证数据的连续性。

    从本身用法是没有什么区别的。
    唯一区别的@@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 是可以的。

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

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

  • 相关阅读:
    maven工程目录结构&常用命令
    slf4j 与 log4j2 实战讲解与日志分割
    跟着大神学zookeeper分布式锁实现-----来自Ruthless
    redis分布式锁Redisson扩展
    Redis分布式锁---完美实现
    redis异常Redis:java.util.NoSuchElementException: Unable to validate object at
    boot中 Quartz注入spring管理类失败
    转载一篇必须超级好的JVM配置实战
    uoj#422. 【集训队作业2018】小Z的礼物(MIn-Max容斥+插头dp)
    uoj#420. 【集训队作业2018】矩形(组合数学)
  • 原文地址:https://www.cnblogs.com/sunheyubo/p/9835876.html
Copyright © 2011-2022 走看看