如何获取sqlserver2005的自增主键值?

eidolon_warrior 2011-03-18 08:29:00
现有系统环境java+sqlserver2000 jdbc2.0

现在有个系统要集成进来,是sqlserver2005的,要在2005数据库中增加记录并用到自动获取自增主键值。
              String sql ="insert tb(..)values() ";

              Class.forName(driver).newInstance();
connection = DriverManager.getConnection(url, user, password);
Statement stmt = connection.createStatement();

stmt.execute(sql);
//这个在jdbc3.0下应该没问题,但用jdbc2.0不行
              stmt.executeUpdate(sql, Statement.RETURN_GENERATED_KEYS);

如何用jdbc2.0的方法,不改变原有环境驱动,在sqlserver2005中插入数据时,自动获取插入后自增主键的值呢?

谢谢!

...全文
1058 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
doublesunli 2012-03-26
  • 打赏
  • 举报
回复
如何判断是否自增
zb519623967 2012-02-10
  • 打赏
  • 举报
回复
come521 2011-08-25
  • 打赏
  • 举报
回复
如何判断是否自增
eidolon_warrior 2011-03-18
  • 打赏
  • 举报
回复

String sql ="insert into tb(f)values('v') select SCOPE_IDENTITY()";
ResultSet rs = stmt.executeQuery(sql);
int keyValue = -1;
if (rs.next()) {
keyValue = rs.getInt(1);
}


这个是解决办法,谢谢各位大虾!
rucypli 2011-03-18
  • 打赏
  • 举报
回复
可以。。。。
eidolon_warrior 2011-03-18
  • 打赏
  • 举报
回复
String sql ="insert into tb(f)values('v') select SCOPE_IDENTITY()";
int id = stmt.executeUpdate(sql);

这样写可以吗?
AcHerat 2011-03-18
  • 打赏
  • 举报
回复
相关内容:

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') 返回的值分别是这两个表最后自增的值。

附:使用@IDENTITY基本知识

1. IDENTITY 列不能由用户直接更新,它是由系统自动维护的。

2.该列数据类型必须为数值型:int, smallint, tinyint, decimal or numeric with scale 0。

3.该列不能为 null。

4.不能在该列上设置缺省值。

5.递增量只能为整形(比如:1,2,-3)。不能为小数,也不能为0。

6.基值(种子值 seed)可以由用户设置,缺省值为1。

理解 @@IDENTITY

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

@@IDENTITY 是当前连接的全局变量,只对当前连接有效。也就是说,如果断开连接再重新连接后,@@IDENTITY 为 null。以 ADO 来说,@@IDENTITY 在 Connection 对象打开和关闭期间是有意义的,即在 Connection 对象的存在范围内有效。在 MTS 组件中,从打开连接到显式的关闭连接(Connection.Close)或者到调用了 SetAbort,SetComplete之前,在这期间,@@IDENTITY 有意义。
AcHerat 2011-03-18
  • 打赏
  • 举报
回复

create table tb(id int identity(1,1),ar varchar(10))
insert into tb
select 'a' union all
select 'b'
go

insert into tb select 'c'
select SCOPE_IDENTITY()

insert into tb select 'd'
insert into tb select 'e'
select SCOPE_IDENTITY()

drop table tb

/*

(1 行受影响)

---------------------------------------
3



(1 行受影响)

(1 行受影响)


---------------------------------------
5

(1 行受影响)
eidolon_warrior 2011-03-18
  • 打赏
  • 举报
回复
你是SQL获取还是程序获取???

这句话我不太明白,说下我的思路:
如果插入后再sql查询自增键最大值,并发时可能会造成访问了别人新增的数据,所以最好是能插入后自动获取?这算程序获取吗?
AcHerat 2011-03-18
  • 打赏
  • 举报
回复
你是SQL获取还是程序获取???









论坛签名======================================================================

当您的问题得到解答后请及时结贴.

http://topic.csdn.net/u/20090501/15/7548d251-aec2-4975-a9bf-ca09a5551ba5.html
http://topic.csdn.net/u/20100428/09/BC9E0908-F250-42A6-8765-B50A82FE186A.html
http://topic.csdn.net/u/20100626/09/f35a4763-4b59-49c3-8061-d48fdbc29561.html

如何给分和结贴?
http://community.csdn.net/Help/HelpCenter.htm#结帖

如何给自己的回帖中也加上签名?
http://blog.csdn.net/q107770540/archive/2011/03/15/6250007.aspx

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧