`
jiangshuiy
  • 浏览: 336279 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

MySQL中获取最后插入的自增ID值

阅读更多
写数据库程序的时候,经常会需要获取某个表中的最大序号数,

在单线程的情况下获取刚插入的数据的id,使用select max(id) from table 是可以的。但在多线程情况下,就不行了。在JAVA中,有下面几种方法:

1. 使用getGeneratedKeys
PreparedStatement  ps  =  conn.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS);      
ps.executeUpdate(); //执行后     
ResultSet rs = ps.getGeneratedKeys(); //获取     
rs.next();       
int id = rs.getInt(1);  


更详细的做法:
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是基于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值。



备注:不过,MySQL 的 JDBC 文档还是推荐使用 JDBC 3.0 的 getGeneratedKeys() 方法,官方的说法是:使用 SELECT LAST_INSERT_ID() 方式增加了一次与数据库交互。详见:http://dev.mysql.com/doc/refman/5.1/zh/connectors.html#cj-retrieve-autoinc

这个链接中分别使用 getGenerateKeys、LAST_INSERT_ID 和可更新结果集做了示例。并在最后部分,分析了一下 getGenerateKeys() 和 LAST_INSERT_ID 的不足之处,楼主有兴趣的话可以去看一下。

分享到:
评论

相关推荐

    Java获取最后插入MySQL记录的自增ID值的3种方法

    介绍了Java获取最后插入MySQL记录的自增ID值的3种方法,有需要的朋友可以参考需要

    mysql的插入问题 怎么获得自动增长的ID

    一张表,里面有ID自增主键,当insert了17条记录之后,删除了第15,16,17条记录,再把Mysql重启,再insert一条记录,这条记录的ID是18还是15 还是MYSQL的,一张表有还是有ID自增主键,用JDBC insert一条语句之内,怎么在JAVA...

    mysql自增id超大问题的排查与解决

    小A正在balabala写代码呢,DBA小B突然发来了一条消息,“快看看你的用户特定信息表T,里面的主键,也就是自增id,都到16亿了,这才多久,在这样下去过不了多久主键就要超出范围了,插入就会失败,balabala……” ...

    PHP获取MySql新增记录ID值的3种方法

    使用此方法得到的是 id最大的值,确为最后一个值,但当多链接线程时,这个最大的id并不一定是我们插入数据的自增id值,因此不适用于多线程。 二,使用函数:msyql_insert_id(); 在PHP中,经常需要把插入数据库中的id...

    MySQL自增列插入0值的解决方案

    在将数据库从MSSQL迁移到MySQL的过程中,基于业务逻辑的要求,需要在MySQL的自增列插入0值。在MSSQL中是这样完成的: 代码如下: string sql;sql = ” set identity_insert dbo.AppUsers on ” + ” insert dbo....

    mysql雪花算法生成唯一整型ID主键的实现方法

    mysql雪花算法生成唯一整型ID主键的实现方法,整型ID作为主键好处有很多,比如节省存储空间、插入和查询排序快、具有一定规律性(时间顺序)等。

    oracle迁移mysql自增序列问题

    今天从oracle迁移数据到mysql碰到个需求:原先的主键字段需要改成mysql中的自增字段,而且原先数据的值不能变,以后新插入的值从原先数据最大的值开始自增。 解决办法: 构建环境: mysql> CREATE TABLE test -> ( ...

    python mysql自增字段AUTO_INCREMENT值的修改方式

    在之前得文章中我们说过,如果使用delete对数据库中得表进行删除,那么只是把记录删除掉,并且id的值还会保持上次的状态。 即删除之前如果有四条数据,删除之后,再添加新的数据,id怎会从5开始。 但是我们显示想让...

    MySQL中不能创建自增字段的解决方法

    引起MySQL不能创建自动增加的字段的原因是在MySQL5.0.2版本中的The Server SQL Mode 中新加了几种 sql_mode,并且在sql的my.ini文件中的sql-mode 默认增加了其中的二种,一个是STRICT_TRANS_TABLES,就是导致auto_...

    MySQL分表自增ID问题的解决方法

    当我们对MySQL进行分表操作后,将不能依赖MySQL的自动增量来产生唯一ID了,因为数据已经分散到多个表中。... 对于插入也就是insert操作,首先就是获取唯一的id了,就需要一个表来专门创建id,插入一条记录,并获取最

    mysql如何让自增id归0解决方案

    最近老是要为现在这个项目初始化数据,搞的很头疼,而且数据库的Id自增越来越大,要让自增重新从1开始:那么就用下面的方法吧: 方法一: 如果曾经的数据都不需要的话,可以直接清空所有数据,并将自增字段恢复从1...

    MySQL自增主键删除后重复问题

    这是我同事的一个朋友遇到的问题,标题可能有些拗口,我重现下场景...但是,如果我们在删除了ID为100的纪录,但是没有重新启动服务器的条件下,再新增一条新纪录,新纪录的自增ID都为101。  为什么会出现这种现象?

    如何在Hive、MySQL、Oracle中分别添加自增序号

    最近公司业务涉及到了在相应库中添加自增序号这种操作,闲暇之余,整理如下,仅供参考~ 一、Hive  1、首先在Hive中建立一个测试表 create table xzw(id int, name string) clustered by (id) into 2 buckets ...

    利用mysql实现的雪花算法案例

    主要介绍了利用mysql实现的雪花算法案例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

    关于MySQL自增ID的一些小问题总结

    例如当前表中有ID为1,2,3三条记录,把3删除,新插入记录的ID从哪儿开始? 答案: 从4开始。 实验 创建表 tb0,ID自增: create table tb0(id int unsigned auto_increment primary key); 插入3条记录: insert ...

    两种mysql对自增id重新从1排序的方法

    最近老是要为现在这个项目初始化数据,搞的很头疼,而且数据库的Id自增越来越大,要让自增重新从1开始:那么就用下面的方法吧: 方法一:如果曾经的数据都不需要的话,可以直接清空所有数据,并将自增字段恢复从1...

    MySQL中实现插入或更新操作(类似Oracle的merge语句)

    主要介绍了在MySQL中实现插入或更新操作(类似Oracle的merge语句)的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下

    Mysql中LAST_INSERT_ID()的函数使用详解

    最近和Sobin在做一个精品课程的项目,因为用到一个固定的id作为表间关联,所以在前一个表插入数据后要把插入数据生成的自增id传递给下一个表。研究了一番决定使用Mysql提供了一个LAST_INSERT_ID()的函数。 代码如下...

    mysql中replace into的用法详解

    新建一个test表,三个字段,uid,name,mobile, id是自增的主键,mobile是唯一索引; create table test( uid int(11) NOT NULL AUTO_INCREMENT, name varchar(50), mobile varchar(11) unique, PRIMARY KEY ...

Global site tag (gtag.js) - Google Analytics