zoukankan      html  css  js  c++  java
  • SQL中返回刚插入记录的ID

    一、要获取此ID,最简单的方法就是:(以下举一简单实用的例子)

    --创建数据库和表
    create database MyDataBase
    use MyDataBase

    create table mytable
    (
    id int identity(1,1),
    name varchar(20)
    )

    --执行这个SQL,就能查出来刚插入记录对应的自增列的值
    insert into mytable values('李四')
    select @@identity

    二、三种方式的比较

    SQL Server 2000中,有三个比较类似的功能:他们分别是:SCOPE_IDENTITY、IDENT_CURRENT 和 @@IDENTITY,它们都返回插入到 IDENTITY 列中的值。

    IDENT_CURRENT 返回为任何会话和任何作用域中的特定表最后生成的标识值。IDENT_CURRENT 不受作用域和会话的限制,而受限于指定的表。IDENT_CURRENT 返回为任何会话和作用域中的特定表所生成的值。
    @@IDENTITY 返回为当前会话的所有作用域中的任何表最后生成的标识值。
    SCOPE_IDENTITY 返回为当前会话和当前作用域中的任何表最后生成的标识值

    SCOPE_IDENTITY 和 @@IDENTITY 返回在当前会话中的任何表内所生成的最后一个标识值。但是,SCOPE_IDENTITY 只返回插入到当前作用域中的值;@@IDENTITY 不受限于特定的作用域。


    例如,有两个表 T1 和 T2,在 T1 上定义了一个 INSERT 触发器。当将某行插入 T1 时,触发器被激发,并在 T2 中插入一行。此例说明了两个作用域:一个是在 T1 上的插入,另一个是作为触发器的结果在 T2 上的插入。


    假设 T1 和 T2 都有 IDENTITY 列,@@IDENTITY 和 SCOPE_IDENTITY 将在 T1 上的 INSERT 语句的最后返回不同的值。


    @@IDENTITY 返回插入到当前会话中任何作用域内的最后一个 IDENTITY 列值,该值是插入 T2 中的值。


    SCOPE_IDENTITY() 返回插入 T1 中的 IDENTITY 值,该值是发生在相同作用域中的最后一个 INSERT。如果在作用域中发生插入语句到标识列之前唤醒调用 SCOPE_IDENTITY() 函数,则该函数将返回 NULL 值。


    而IDENT_CURRENT('T1') 和 IDENT_CURRENT('T2') 返回的值分别是这两个表最后自增的值。

    ajqc的实验:(40条本地线程,40+40条远程线程同时并发测试,插入1200W行),得出的结论是:
    1. 在典型的级联应用中.不能用@@IDENTITY,在CII850,256M SD的机器上1W多行时就会并发冲突.在P42.8C,512M DDR上,才6000多行时就并发冲突.
    2.SCOPE_IDENTITY()是绝对可靠的,可以用在存储过 程中,连触发器也不用建,没并发冲突

    SELECT IDENT_CURRENT('TableName') --返回指定表中生成的最后一个标示值   
    SELECT IDENT_INCR('TableName')--返回指定表的标示字段增量值
    SELECT IDENT_SEED('TableName')--返回指定表的标示字段种子值

    返回最后插入记录的自动编号
    SELECT IDENT_CURRENT('TableName')
    返 回下一个自动编号:   
    SELECT IDENT_CURRENT('TableName') + (SELECT IDENT_INCR('TableName'))

    SELECT @@IDENTITY --返回当前会话所有表中生成的最后一个标示值

  • 相关阅读:
    JVM 综述
    看 Netty 在 Dubbo 中如何应用
    Netty 心跳服务之 IdleStateHandler 源码分析
    Netty 高性能之道
    Netty 解码器抽象父类 ByteToMessageDecoder 源码解析
    Netty 源码剖析之 unSafe.write 方法
    Netty 出站缓冲区 ChannelOutboundBuffer 源码解析(isWritable 属性的重要性)
    Netty 源码剖析之 unSafe.read 方法
    Netty 内存回收之 noCleaner 策略
    Netty 源码阅读的思考------耗时业务到底该如何处理
  • 原文地址:https://www.cnblogs.com/nimorl/p/1687116.html
Copyright © 2011-2022 走看看