您的位置:首页 > 数据库

如何取得刚插入数据库的数据的id m…

2013-10-30 11:52 316 查看
(原)

两条SQl语句

第一步 insert 语句

第二步 根据插入字段查询出id

即 select id from tab where
(关键条件,确保几个条件的组合是唯一的)

(转)

转自于:http://hi.baidu.com/hlz_1987/blog/item/99b27faff0b82ce6faed50e0.html,仅供学习

插入后用 

SELECT   LAST_INSERT_ID(); 

获得刚插入的id号,多客户端并发插入对取到的id号不会有问题,因为各线程独立。

 

,我也查到一种方法: 

select   @@session.identity;

 

 

我们在写数据库程序的时候,经常会需要获取某个表中的最大序号数,

一般情况下获取刚插入的数据的id,使用select max(id) from table
是可以的。

但在多线程情况下,就不行了。

下面介绍三种方法

(1) getGeneratedKeys()方法:

程序片断:

Connection conn = ;

       
Serializable ret = null;

       
PreparedStatement state = .;

       
ResultSet rs=null;

       
try {

           
state.executeUpdate();

           
rs = state.getGeneratedKeys();

           
if (rs.next()) {

               
ret = (Serializable) rs.getObject(1);

           
}       

       
} catch (SQLException e) {

       


       
return ret;

(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
而不用担心其它客户端的活动,而且不需要加锁。使用单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值。

 

 

 

注:在java中使用last_insert_id();是要在一插入后就使用,也就是不能新建立Connection

比如insert建了一个
Connection,用last_insert_id()就要用同一个Connection,不能在两条查询语句(即“insert
into。。。”和"select
last_insert_id()")都使用getConn()创建新管道,正确的做法是insert语句getConn()创建了管道以
后,"select
last_insert_id()"就直接用全局变量的conn也就是创建好的同一管道查询才有效果,否则会返回0得不到新插入的自动增长列列号,切
忌!!!!!!!!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: