在插入数据后,如何得知其ID

keephope 2006-10-23 09:28:49
我用的是MSSQL数据库

表的ID是自动增长的

类型是int

在插入数据时我不去特意指定ID多少

(貌似指定了就非法)

后来需要在插入一条数据的同时

得到该条数据在表中的ID

请问如何得到?

用JAVA代码应该如何取出?
...全文
587 32 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
32 条回复
切换为时间正序
请发表友善的回复…
发表回复
keephope 2006-11-07
  • 打赏
  • 举报
回复
用存储过程,添加成功以后回产生一个ID
CREATE PROCEDURE TT_Add
(
@变量
)
AS

INSERT INTO 表名
(

)
VALUES
(


)

SELECT
@@Identity AS EntryLogID

GO

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

这个是我看好的解决方法

但是存储过程目前我是不会写的

还得回去看书了

11月10日结贴吧
liltos 2006-11-04
  • 打赏
  • 举报
回复
这个问题困扰了很久,想了很多办法,可还是没搞定。
下次得去看一下UUID了。
daizhenbest 2006-11-03
  • 打赏
  • 举报
回复
ID不能认为指定

只允许数据库自己生成

目前我只能时候插入后再查询一次

并且按照降序排列

才能保证获得刚插入的数据的ID
----------------------------------------------------------
这样有个问题,就是并发操作的时候,有可能产生错误.

以前也遇到过这中情况.插入一条数据的时候,要修改另外一个表,而这个表的外键是第一个表的主键. 最后使用出发器解决的.
wyhlgx 2006-11-03
  • 打赏
  • 举报
回复
简单,你在用JAVA进行插入的时候,在代码前面定义一个用来接受的字符串数组,每插入一条成功后,就select id出来,然后放到字符串数组里,等下要的时候,就去取就是了。Do you know?
bgu 2006-11-03
  • 打赏
  • 举报
回复
SQL server 里的 @@IDENTITY 是线程安全的。
不会出现有:
--------------

插入后再查询一次获得的可不一定是正确的ID,如果两个用户同时插入了数据,顺序是:
user1: do insert
user2: do insert
user1: do query
user2: do query

user1得到的id是user2的
--------------

这样的情况。

可以查SQL server的帮助
fynshmily 2006-11-03
  • 打赏
  • 举报
回复
写错了.
ResultSet
hehe
fynshmily 2006-11-03
  • 打赏
  • 举报
回复
是刚插如的吗?
如果刚插入的可以用
sql = "select max(id列名) from 表名"
RequestSet rs = stmt.executeQuery(sql);
while(rs.next()){
System.out.println(rs.getInt(1));//这里是取得rs返回结果集的第一列的值.
}
是个苯方法.
daichenghua 2006-11-02
  • 打赏
  • 举报
回复
用存储过程,添加成功以后回产生一个ID
CREATE PROCEDURE TT_Add
(
@变量
)
AS

INSERT INTO 表名
(

)
VALUES
(


)

SELECT
@@Identity AS EntryLogID

GO
hohowu 2006-11-02
  • 打赏
  • 举报
回复
oracle 下还有sequence可以用.

keephope 2006-11-02
  • 打赏
  • 举报
回复
ID不能认为指定

只允许数据库自己生成

目前我只能时候插入后再查询一次

并且按照降序排列

才能保证获得刚插入的数据的ID
廖雪峰 2006-11-02
  • 打赏
  • 举报
回复
插入后再查询一次获得的可不一定是正确的ID,如果两个用户同时插入了数据,顺序是:
user1: do insert
user2: do insert
user1: do query
user2: do query

user1得到的id是user2的

最好的办法是不要用自增主键,自己管理增长,但是也比较麻烦
或者,用uuid做主键,每次用UUID.randomUUID().toString()获得唯一的主键,这种方式不但保证无重复,还保证集群环境下无冲突
iwlk 2006-11-02
  • 打赏
  • 举报
回复
select @@IDENTITY
cseu 2006-11-01
  • 打赏
  • 举报
回复
自己在类中加个id属性不就行了
Sunny319 2006-11-01
  • 打赏
  • 举报
回复
mark
keephope 2006-11-01
  • 打赏
  • 举报
回复
String strSql = "INSERT INTO [table]( [column] ) VALUES ( "value" );SELECT @@IDENTITY AS 'result'";
int intResult = (int)ResultSset.ExecuteScalar( strSql );
-------------------------------------------------------------------------

ResultSset这个类并不是系统自己带的吧

----------------------------------------------------------------------------
最好不要用自增长的ID,要么自己增长,要么用uuid

我推荐uuid,任何环境下都没有问题,包括集群

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

uuid是什么呢??

数据库方面有许多东西是我并不知道的
廖雪峰 2006-10-31
  • 打赏
  • 举报
回复
最好不要用自增长的ID,要么自己增长,要么用uuid

我推荐uuid,任何环境下都没有问题,包括集群
bgu 2006-10-31
  • 打赏
  • 举报
回复
Insert后,可以用这个系统变量得到:@@IDENTITY

You can try:

INSERT INTO [table]( [column] ) VALUES ( "value" )
PRINT( @@IDENTITY )
keephope 2006-10-31
  • 打赏
  • 举报
回复
而且最重要的是

ResutSet.executeQuery(sql);

根本就没有这个方法

我试过类似的思路

依然是不行的

当ID是唯一,而名字不唯一的时候

如何获得其ID呢?
bgu 2006-10-31
  • 打赏
  • 举报
回复
Java我不是很懂。哈。不过既然你是用SQL server那就是一样D。
在SQL server中,SQL语句可以用分号分开即可。Oracle则是不行。

下面的code可以参考下:
String strSql = "INSERT INTO [table]( [column] ) VALUES ( 'value' );SELECT @@IDENTITY AS 'result'";
int intResult = (int)ResultSset.ExecuteScalar( strSql );
bgu 2006-10-31
  • 打赏
  • 举报
回复
String strSql = "INSERT INTO [table]( [column] ) VALUES ( "value" );SELECT @@IDENTITY AS 'result'";
int intResult = (int)ResultSset.ExecuteScalar( strSql );
加载更多回复(12)

81,122

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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