当前页面: 开发资料首页 → 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日结贴吧