在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 数据库处理类 /* 文 件 名:CDataBase.php 类 名:CDataBase 继承关系:XMLClass 通用属性: $Con | 数据连接标识 $DBaseName | 数据库名称 $UserID | 数据库登陆用户名 $PassWord | ...
下边是部分目录,觉得有用的话就顶一个<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数据库的文件...
│ sqlserver2000.txt │ ├─第01章 │ 1.9.1 设置内存选项.sql │ 1.9.2(2) 使用文件及文件组.sql │ 1.9.2(3) 调整tempdb数据库的文件属性.sql │ ├─第02章 │ │ 2.1 日期概念理解中的一些测试.sql │ │ ...
(4)掌握主流数据库开发及系统设计技术,具体要求如下: 关系数据库采用Oracle、 SqlServer、MySQL等; 开发语言采用JSP+Java或.Net等; 系统构架采用SSH、SSM等MV C多层结构; 运行模式为B/S模式,要求至少能在...
本网站以xp为Web平台,JSP+Ajax+Servlet+JavaBean+Hibernate为网站实现技术,建立基于MySQL数据库系统的核心动态网页,实现博客网站前台及博客个人维护管理等功能模块。 1、 系统处理的准确性和及时性:系统处理的...
在设计数据库的表结构时,经常会使用一个自动增长的数字序列作为主键字段(代理主键)。除了作为主键使用之外,自增字段也可以用于记录各个操作发生的先后顺序,因为它具有递增特性。当我们插入一行数据时,数据库会...
在做《机房收费系统》的时候,有的表需要添加自增列,在添加新纪录时自动添加一...打开对象资源管理器,新建表,如下图 插入列,设置列属性,标识增量为步长,标识种子为开始数,如下图 初学者,不当之处敬请批评指正!
能连接到MySql,Oracle和Ms Sql Server三种数据库。 2. 连接到数据库后,会提供数据库Schema和表的树视图以便用户进行浏览和查找,另外还提供了一个过滤器帮助用户缩小查找范围。 3. 用户能自动快速获取单表的创建...
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的...
* 5.identity 使用SQL Server和MySQL的自增字段,这个方法不能放到Oracle中,Oracle不支持自增字段,要设定sequence(MySQL和SQL Server中很常用)。等同于JPA中的IDENTITY * 例:@GeneratedValue(generator = ...
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) ...
name 命名为aa,然后sql语句....where s_name= #{aa} 中就可以根据aa得到参数值 修改 回显 Controller @PathVariable("bid") 通过 @PathVariable 可以将 URL 中占位符参数绑定到控制器处理方法的入参中:URL 中...
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....
尤其值得注意的是,书中使用了多个“中场”章节,以便在学习过一定知识之后,通过实际例子来对所学的知识进行巩固,这些章节介绍的内容具有很强的实用价值。因此本书不仅对Web编程的入门者,即使对于有一定经验的Web...
默认收藏夹中无SAP EDITOR一项,通过输入快捷代码 SE38 调用编辑器,这时可在TOOLS中 修改菜单项名称 。 四,ABAP/4编程 未获ACCESS KEY时创建程序的规则如下 A),创建程序时程序以Z、Y、SAPMY、SAPMZ开头,并遵守...