`
lovnet
  • 浏览: 6704802 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

在SQLServer/MySQL数据库中如何取得刚插入的标识值

 
阅读更多

在SQLServer/MySQL数据库中如何取得刚插入的标识值

在SQLServer数据库中

数据库实际应用中,我们往往需要得到刚刚插入 的标志值来往相关表中写入数据。但我们平常得到的真的是我们需要的那个值么?
(1)、有时我们会使用 SELECT @@Identity 来获得我们刚刚插入的值,比如下面的代码

代码一:
use tempdb
if exists (select * from sys.objects where object_id = object_id(N'[test1]') and type in (N'u'))
drop table [test1]
go
create table test1
(
id int identity(1,1),
content nvarchar(100)
)
insert into test1 (content) values ('solorez')
select @@identity

乐观情况下,这样做是没问题的,但如果我们如果先运行下面的代码二创建一个触发器、再运行代码三:

代码二:
create table test2
(
id int identity(100,1),
content nvarchar(100)
)

create trigger tri_test1_identitytest_I
on test1 after insert
as
begin
insert into test2
select content from inserted
end

代码三:
insert into test1 (content) values ('solorez2')
select @@identity

我们可以看到,此时得到的标识值已经是100多了,很明显,这是表test2的生成的标识值,已经不是我们想要的 了。
我们可以看看@@identity的定义:Identity
原来,@@identity返回的是当前事务最后插入的标识值,因为在Insert Test1表执行后,紧接着触发了触发器又Insert Test2表,所以,这时候@@identity的值就是表test2的生成的标识值。

(2)、这 时我们或许会用下面的方法:

代码四:
insert into test1 (content) values ('solorez3')
SELECT IDENT_CURRENT('test1')

看来结果还比较正确,但如果我们在多次运行代码四的同时运行下面的代码五:

代码五:
insert into test1 (content) values ('solorez3')

waitfor delay '00:00:20'
SELECT IDENT_CURRENT('test1')

结果又 不是我们想要的了!
再看看IDENT_CURRENT(Tablename) 的定义:IDENT_CURRENT(Tablename)
是 返回指定表的最后标识值。

(3)、到这里,是该亮出答案的时候了,我们可以使用下面的代码:

代码六:
insert into test1 (content) values ('solorez3')
SELECT scope_identity()

这时,我们无论是添加触发器还是运行并行插入,得到的始终是当前事务的标识值。

scope_identity()的定义:scope_identity()返回为当前会话和当前作用域中的某个表生成的最新标识值

三个函数的区别:

IDENT_CURRENT 返回为某个会话和用域中的指定表生成的最新标识值。

@@IDENTITY 返回为跨所有作用域的当前会话中的某个表生成的最新标识值。

SCOPE_IDENTITY 返回为当前会话和当前作用域中的某个表生成的最新标识值。

在MySQL数据库中

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

但在多线程情况下,就不行了。

下面介绍三种方法

(1) getGeneratedKeys()方法:

(2)LAST_INSERT_ID:

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

在多用户交替插入数据的情况下max(id)显然不能用。

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

可以用 SELECT LAST_INSERT_ID(); 查询LAST_INSERT_ID的值.

使用单INSERT语句插入多条记录, LAST_INSERT_ID只返回插入的第一条记录产生的值.

(3)select @@IDENTITY:

String sql=”select @@IDENTITY”;

@@identity是表示的是最近一次向具有identity属性(即自增列)的表插入数据时对应的自增列的值,是系统定义的全局变量。一般系统定义的全局变量都是以@@开头,用户自定义变量以@开头。比如有个表A,它的自增列是id,当向A表插入一行数据后,如果插入数据后自增列的值自动增加至101,则通过select @@identity得到的值就是101。使用@@identity的前提是在进行insert操作后,执行select @@identity的时候连接没有关闭,否则得到的将是NULL值。

分享到:
评论

相关推荐

    php mysql+sql server 数据库处理类

    php mysql+sql server 数据库处理类 /* 文 件 名:CDataBase.php 类 名:CDataBase 继承关系:XMLClass 通用属性: $Con | 数据连接标识 $DBaseName | 数据库名称 $UserID | 数据库登陆用户名 $PassWord | ...

    Sqlserver2000经典脚本

    下边是部分目录,觉得有用的话就顶一个<br/>C:.<br/>│ sqlserver2000.txt<br/>│ <br/>├─第01章<br/>│ 1.9.1 设置内存选项.sql<br/>│ 1.9.2(2) 使用文件及文件组.sql<br/>│ 1.9.2(3) 调整tempdb数据库的文件...

    经典SQL脚本大全

    │ sqlserver2000.txt │ ├─第01章 │ 1.9.1 设置内存选项.sql │ 1.9.2(2) 使用文件及文件组.sql │ 1.9.2(3) 调整tempdb数据库的文件属性.sql │ ├─第02章 │ │ 2.1 日期概念理解中的一些测试.sql │ │ ...

    数据库课程设计题目汇总.doc

    (4)掌握主流数据库开发及系统设计技术,具体要求如下: 关系数据库采用Oracle、 SqlServer、MySQL等; 开发语言采用JSP+Java或.Net等; 系统构架采用SSH、SSM等MV C多层结构; 运行模式为B/S模式,要求至少能在...

    基于J2EE框架的个人博客系统项目毕业设计论文(源码和论文)

    本网站以xp为Web平台,JSP+Ajax+Servlet+JavaBean+Hibernate为网站实现技术,建立基于MySQL数据库系统的核心动态网页,实现博客网站前台及博客个人维护管理等功能模块。 1、 系统处理的准确性和及时性:系统处理的...

    【总结】数据库自增字段的 3 种实现方式

    在设计数据库的表结构时,经常会使用一个自动增长的数字序列作为主键字段(代理主键)。除了作为主键使用之外,自增字段也可以用于记录各个操作发生的先后顺序,因为它具有递增特性。当我们插入一行数据时,数据库会...

    SQL Server 2008怎样添加自增列实现自增序号

    在做《机房收费系统》的时候,有的表需要添加自增列,在添加新纪录时自动添加一...打开对象资源管理器,新建表,如下图 插入列,设置列属性,标识增量为步长,标识种子为开始数,如下图 初学者,不当之处敬请批评指正!

    SqlToolBox 1.8.2

    能连接到MySql,Oracle和Ms Sql Server三种数据库。 2. 连接到数据库后,会提供数据库Schema和表的树视图以便用户进行浏览和查找,另外还提供了一个过滤器帮助用户缩小查找范围。 3. 用户能自动快速获取单表的创建...

    php网络开发完全手册

    14.1 MySQL数据库的介绍 219 14.2 安装与配置 219 14.2.1 下载MySQL 219 14.2.2 MySQL的安装 220 14.2.3 MySQL的配置 221 14.2.4 MySQL的启动与关闭 222 14.3 如何创建一个数据库与表 223 14.3.1 登录与退出MySQL的...

    Hibernate注解

    * 5.identity 使用SQL Server和MySQL的自增字段,这个方法不能放到Oracle中,Oracle不支持自增字段,要设定sequence(MySQL和SQL Server中很常用)。等同于JPA中的IDENTITY * 例:@GeneratedValue(generator = ...

    Javashop开发规范V2.2

    xml Mysql Oracle SqlServer int int NUMBER smallint int(1) smallint(1) NUMBER(2) int memo text CLOB text datetime datetime TIMESTAMP datetime long bigint NUMBER bigint decimal decimal NUMBER(20,2) ...

    乐优商城.xmind

    name 命名为aa,然后sql语句....where s_name= #{aa} 中就可以根据aa得到参数值 修改 回显 Controller @PathVariable("bid") 通过 @PathVariable 可以将 URL 中占位符参数绑定到控制器处理方法的入参中:URL 中...

    Java Web编程宝典-十年典藏版.pdf.part2(共2个)

    7.6.1 JDBC连接SQLServer2005数据库 76.2 网站用户注册 7.7 疑难解惑 7.7.1 Prepared Statement与Statement 7.7.2 预编译的理解 7.8 精彩回顾 第8章 浅尝辄止 ——初识Struts2 8.1 本章学习任务 8.1.1 本章知识体系...

    易语言程序免安装版下载

    修改外部数据库在4.12版中导致的不兼容问题,并增加了对MS SQL Server数据库中image和text字段类型的说明。 7. 修改扩展界面支持库一,禁止透明标签在父窗口刷新时自动刷新,以解决其导致窗口刷新缓冲的问题。 8....

    PHP3程序设计

    尤其值得注意的是,书中使用了多个“中场”章节,以便在学习过一定知识之后,通过实际例子来对所学的知识进行巩固,这些章节介绍的内容具有很强的实用价值。因此本书不仅对Web编程的入门者,即使对于有一定经验的Web...

    ABAP开发环境的安装

    默认收藏夹中无SAP EDITOR一项,通过输入快捷代码 SE38 调用编辑器,这时可在TOOLS中 修改菜单项名称 。 四,ABAP/4编程 未获ACCESS KEY时创建程序的规则如下 A),创建程序时程序以Z、Y、SAPMY、SAPMZ开头,并遵守...

Global site tag (gtag.js) - Google Analytics