站内搜索: 请输入搜索关键词

当前页面: 开发资料首页JSP 专题在插入数据后,如何得知其ID

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

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


我用的是MSSQL数据库

表的ID是自动增长的

类型是int

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

(貌似指定了就非法)

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

得到该条数据在表中的ID

请问如何得到?

用JAVA代码应该如何取出?


这个我刚问过,哎,用HBnet倒可以搞定,如果不方便用的话,只好用插入的数据查了


只有这个方法了吗


order by id desc


String sql=select * from table where name="";
int id=ResutSet.executeQuery(sql);




插入返回的数值就是你要的id


banjinmu is right


上面三说的好!


http://www.quandi.cn/WebForm1.aspx?quandi_id=asdex1999


真好,我马上去改掉


分。


String sql=select * from table where name="";
int id=ResutSet.executeQuery(sql);


这个方法已经试过了

但是如果是重名的怎么办??

而且返回的数字是查询结果的条数

并不是ID数吧


而且最重要的是

ResutSet.executeQuery(sql);

根本就没有这个方法

我试过类似的思路

依然是不行的

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

如何获得其ID呢?


Insert后,可以用这个系统变量得到:@@IDENTITY

You can try:

INSERT INTO [table]( [column] ) VALUES ( "value" )
PRINT( @@IDENTITY )


那么我在JAVA应该怎么写呢

INSERT INTO [table]( [column] ) VALUES ( "value" )
PRINT( @@IDENTITY )

这个东西我明白

但是却不知道在JAVA中怎么取出@@IDENTITY


String strSql = "INSERT INTO [table]( [column] ) VALUES ( "value" );SELECT @@IDENTITY AS 'result'";
int intResult = (int)ResultSset.ExecuteScalar( strSql );


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 );



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

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


String strSql = "INSERT INTO [table]( [column] ) VALUES ( "value" );SELECT @@IDENTITY AS 'result'";
int intResult = (int)ResultSset.ExecuteScalar( strSql );
-------------------------------------------------------------------------

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

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

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

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

uuid是什么呢??

数据库方面有许多东西是我并不知道的


mark


自己在类中加个id属性不就行了


ID不能认为指定

只允许数据库自己生成

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

并且按照降序排列

才能保证获得刚插入的数据的ID



用存储过程,添加成功以后回产生一个ID
CREATE PROCEDURE TT_Add
(
@变量
)
AS

INSERT INTO 表名
(

)
VALUES
(


)

SELECT
@@Identity AS EntryLogID

GO


select @@IDENTITY


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

user1得到的id是user2的

最好的办法是不要用自增主键,自己管理增长,但是也比较麻烦
或者,用uuid做主键,每次用UUID.randomUUID().toString()获得唯一的主键,这种方式不但保证无重复,还保证集群环境下无冲突


oracle 下还有sequence可以用.




ID不能认为指定

只允许数据库自己生成

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

并且按照降序排列

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

以前也遇到过这中情况.插入一条数据的时候,要修改另外一个表,而这个表的外键是第一个表的主键. 最后使用出发器解决的.


是刚插如的吗?
如果刚插入的可以用
sql = "select max(id列名) from 表名"
RequestSet rs = stmt.executeQuery(sql);
while(rs.next()){
System.out.println(rs.getInt(1));//这里是取得rs返回结果集的第一列的值.
}
是个苯方法.


写错了.
ResultSet
hehe


SQL server 里的 @@IDENTITY 是线程安全的。
不会出现有:
--------------

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

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

这样的情况。

可以查SQL server的帮助


简单,你在用JAVA进行插入的时候,在代码前面定义一个用来接受的字符串数组,每插入一条成功后,就select id出来,然后放到字符串数组里,等下要的时候,就去取就是了。Do you know?


这个问题困扰了很久,想了很多办法,可还是没搞定。
下次得去看一下UUID了。


用存储过程,添加成功以后回产生一个ID
CREATE PROCEDURE TT_Add
(
@变量
)
AS

INSERT INTO 表名
(

)
VALUES
(


)

SELECT
@@Identity AS EntryLogID

GO

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

这个是我看好的解决方法

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

还得回去看书了

11月10日结贴吧


↑返回目录
前一篇: POI 处理 EXCEL 问题,求助
后一篇: 关于提交取值的问题