`
cheeruplc
  • 浏览: 114027 次
  • 性别: Icon_minigender_2
  • 来自: 深圳
社区版块
存档分类
最新评论

@@Identity 与触发器冲突的解决方案

阅读更多
转载http://blog.csdn.net/shulianyong/article/details/4363039
@@IDENTITY
返回最后插入的标识值。

语法
@@IDENTITY

返回类型
numeric

注释
在一条 INSERT、SELECT INTO 或大容量复制语句完成后,@@IDENTITY 中包含此语句产生的最后的标识值。若此语句没有影响任何有标识列的表,则 @@IDENTITY 返回 NULL。若插入了多个行,则会产生多个标识值,@@IDENTITY 返回最后产生的标识值。如果此语句激发一个或多个执行产生标识值的插入操作的触发器,则语句执行后立即调用 @@IDENTITY 将返回由触发器产生的最后的标识值。若 INSERT 或 SELECT INTO 语句失败或大容量复制失败,或事务被回滚,则 @@IDENTITY 值不会还原为以前的设置。

在返回插入到表的 @@IDENTITY 列的最后一个值方面,@@IDENTITY、SCOPE_IDENTITY 和 IDENT_CURRENT 函数类似。

@@IDENTITY 和 SCOPE_IDENTITY 将返回在当前会话的所有表中生成的最后一个标识值。但是,SCOPE_IDENTITY 只在当前作用域内返回值,而 @@IDENTITY 不限于特定的作用域。

IDENT_CURRENT 不受作用域和会话的限制,而受限于指定的表。IDENT_CURRENT 返回任何会话和任何作用域中为特定表生成的标识值。有关更多信息,请参见 IDENT_CURRENT。


---------------------------------------------------------------

我总结的3种返回最大标识值的方法的不同点:

IDENT_CURRENT 返回为任何会话和任何作用域中的特定表最后生成的标识值。


@@IDENTITY 返回为当前会话的所有作用域中的任何表最后生成的标识值。


SCOPE_IDENTITY 返回为当前会话和当前作用域中的任何表最后生成的标识值。(防止返回触发器中的insert的IDENTITY值)
---------------------------------------------------------------

@@IDENTITY
返回最后插入的标识值。

语法
@@IDENTITY

返回类型
numeric

注释
在一条 INSERT、SELECT INTO 或大容量复制语句完成后,@@IDENTITY 中包含此语句产生的最后的标识值。若此语句没有影响任何有标识列的表,则 @@IDENTITY 返回 NULL。若插入了多个行,则会产生多个标识值,@@IDENTITY 返回最后产生的标识值。如果此语句激发一个或多个执行产生标识值的插入操作的触发器,则语句执行后立即调用 @@IDENTITY 将返回由触发器产生的最后的标识值。若 INSERT 或 SELECT INTO 语句失败或大容量复制失败,或事务被回滚,则 @@IDENTITY 值不会还原为以前的设置。

在返回插入到表的 @@IDENTITY 列的最后一个值方面,@@IDENTITY、SCOPE_IDENTITY 和 IDENT_CURRENT 函数类似。

@@IDENTITY 和 SCOPE_IDENTITY 将返回在当前会话的所有表中生成的最后一个标识值。但是,SCOPE_IDENTITY 只在当前作用域内返回值,而 @@IDENTITY 不限于特定的作用域。

IDENT_CURRENT 不受作用域和会话的限制,而受限于指定的表。IDENT_CURRENT 返回任何会话和任何作用域中为特定表生成的标识值。有关更多信息,请参见 IDENT_CURRENT。

示例
下面的示例向带有标识列的表中插入一行,并用 @@IDENTITY 显示在新行中使用的标识值。

INSERT INTO jobs (job_desc,min_lvl,max_lvl)
VALUES ('Accountant',12,125)
SELECT @@IDENTITY AS '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()是绝对可靠的,可以用在存储过程中,连触发器也不用建,没并发冲突
分享到:
评论

相关推荐

    @@IDENTITY与SCOPE_IDENTITY()

    此外,如果触发器在插入操作后进行了其他插入,`@@IDENTITY`将返回触发器生成的最后一个标识值,这可能导致非预期的结果。 相比之下,`SCOPE_IDENTITY()`函数更具有局限性,它返回的是在当前作用域内,也就是在同一...

    对有insert触发器表取IDENTITY值时发现的问题

    问题是这样的: T1表上有一个INSERT的触发器,在插入数据的时候,会自动往T2表里面插一条记录 这样当我在T1表上插入新的数据时,取@@IDENTITY的时候,返回的id值是T2表里面的新记录的值 赶快查了下msdn,原来@@IDENTITY...

    IBM_Tivoli_Identity_Manager解决方案

    ### IBM Tivoli Identity Manager 解决方案 #### 一、前言 IBM Tivoli Identity Manager(TIM)作为IBM安全产品家族的一员,在不断进化和完善的过程中,不仅满足了市场需求的变化,还融入了大量的用户反馈,旨在为...

    向数据库中插入数据并返回当前插入的行数及全局变量@@IDENTITY应用

    在Microsoft SQL Server中,有一个全局变量`@@IDENTITY`,它可以帮助我们实现这一需求。本篇文章将详细介绍如何使用`@@IDENTITY`来返回当前插入的行数,以及它在批量插入情况下的应用。 `@@IDENTITY`是SQL Server...

    sql Identity

    ### SQL中的Identity与@@IDENTITY的应用 在SQL中,`Identity`是一个非常实用的功能,它允许用户在插入新行时自动生成唯一的标识符。这一特性广泛应用于主键字段的自动填充,尤其当需要唯一标识每条记录时。本文将...

    触发器在sql server中的应用.pdf

    - 触发器内不能使用某些系统函数,如@@IDENTITY。 - 触发器可能会因为过于复杂而影响数据库性能。 - 不恰当的触发器逻辑可能会导致数据修改操作失败或产生不一致的数据。 通过上述内容,我们可以看到触发器在SQL ...

    SQLSERVER触发器插入数据

    ### SQL Server 触发器知识点解析 #### 一、标题:SQL Server 触发器插入数据 本篇文章主要介绍如何在SQL Server中使用触发器来实现数据的自动插入功能。触发器是一种存储过程,它定义在特定的表上,并且在特定的...

    identity用法总结

    Identity 列的语法为:IDENTITY [ (seed , increment) ],其中 seed 是加载到表中的第一个行所使用的值,increment 是与前一个加载行的标识的增量值。如果以上两个都没有指定,那么默认是(1,1)。 2、SET ...

    数据库应用技术:第11章 存储过程与触发器.doc

    存储过程与触发器 第 11 章 存储过程与触发器是数据库应用技术的重要组成部分。本章主要介绍了 SQL Server 2005 中存储过程的概念、类型、常用系统存储过程以及如何创建存储过程;另外介绍了触发器的类型以及创建...

    Oracle Identity Manager

    Oracle Identity Manager (OIM) 11g 是一款全面的身份管理解决方案,旨在帮助企业管理和自动化用户身份的生命周期管理过程。通过OIM 11g,组织可以有效地控制对各种应用程序和服务的访问权限,确保符合合规性要求,...

    sql触发器实例加解析

    #### 一、SQL触发器概念与作用 SQL触发器是一种存储过程,它在数据表中的数据被修改(插入、更新或删除)时自动执行。触发器可以用来确保数据完整性,并且可以实现复杂的业务逻辑。 #### 二、触发器类型 触发器...

    Identity用法

    - **数据迁移**:在进行数据迁移时,需确保 `Identity` 列的值不会冲突,以免引起数据错误。 - **性能优化**:对于大数据量的表,适当优化 `Identity` 列的使用方式可以提高性能。 #### 标签:Identity用法 - **...

    ATM存储和触发器

    #### 二、触发器概念与应用 **1. 触发器简介** 触发器是一种特殊类型的存储过程,它会在特定事件发生时自动执行,例如当数据被插入、更新或删除时。触发器可以用来实现复杂的业务逻辑和数据完整性检查。 **2. ...

    Set IDENTITY _INSERTY用法

    在数据库管理与开发过程中,`SET IDENTITY_INSERT` 是一个非常实用的功能,主要用于允许或禁止手动插入带有 `IDENTITY` 属性的字段值。这一特性对于需要进行数据迁移或者特殊场景下的数据操作非常重要。 #### 1. ...

    SQL常见面试题

    - **并发问题与解决方案:** - 当存在多个并发连接时,每个连接执行INSERT操作后,它们各自调用`@@IDENTITY`返回的将是各自最近插入记录的自增长值,而不是其他连接的值。 - 示例代码: ```sql SELECT DISTINCT ...

    oracle通过触发器,实现序列自增

    本文将详细介绍如何通过触发器与序列相结合的方式,在Oracle数据库中实现记录的自增功能。 #### 一、理解Oracle序列 在开始之前,首先需要了解Oracle中的序列。序列是一个数据库对象,它能够生成连续的整数序列。...

    Oracle Identity Management身份管理和安全解决方案v1.pptx

    Oracle统一身份管理解决方案,是企业各个应用系统账号管理利器

Global site tag (gtag.js) - Google Analytics