备注:使用以下方法的时候,插入与主键查询必须确保在同一个事务当中。
我们在写数据库程序的时候,经常会需要获取某个表中的最大序号数,
一般情况下获取刚插入的数据的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值。
文章出处:飞诺网(www.firnow.com):http://dev.firnow.com/course/7_databases/mysql/Mysqljs/2007926/73822.html
分享到:
相关推荐
一张表,里面有ID自增主键,当insert了17条记录之后,删除了第15,16,17条记录,再把Mysql重启,再insert一条记录,这条记录的ID是18还是15 还是MYSQL的,一张表有还是有ID自增主键,用JDBC insert一条语句之内,怎么在JAVA...
mybatis 获取mysql插入记录的自增长字段值
mysql用触发器实现char类型主键自增长
mysql取得自动增长的主键值,mysql组织推荐的一种安全的方法!
介绍了Java获取最后插入MySQL记录的自增ID值的3种方法,有需要的朋友可以参考需要
借鉴大牛经验,mysql 设置自增长,时间字段。
主要介绍了Python3 操作 MySQL 插入一条数据并返回主键 id的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
利用mysql sql 来实现日期自动增或者自动减的。同时也写对mybatis使用该sql的一些踩坑写出来了。
该资源主要实现如下功能,利用poi获取excel中大量数据,然后利用jdbc批量插入到mysql
java插入mysql中文乱码解决
mysql雪花算法生成唯一整型ID主键的实现方法,整型ID作为主键好处有很多,比如节省存储空间、插入和查询排序快、具有一定规律性(时间顺序)等。
方法一: 使用MYSQL推出的MySQL Connector/...方法三: 使用CoreLab推出的MYSQL访问组件,面向.NET 安装完成后,引用命名空间:CoreLab.MySql; 使用命令编译时:csc /r:CoreLab.MySql.dll test.cs
MySQL创建存储过程批量插入10万条数据 存储过程 1、首先防止主键冲突,我们清空表。 TRUNCATE table A_student; 2、编写存储过程 delimiter ‘$’; CREATE PROCEDURE batchInsert(in args int) BEGIN declare i int ...
mysql中插入多text类型问题,可以让mysql数据库插入多个大存储类型
使用Oracle开发过程中id不会像MySQL那样能够自动增长,此时需要对id进行相关的设置,id的自动增长能够更好地帮助你在开发过程中进行统计与整理数据
linux中mysql开机自动启动3种方法.docx
mysql innodb类型数据库表 根据ibd文件获取表 space id,用于恢复innodb类型数据表数据
个人总结了遇到使用Mysql数据库插入中文时产生乱码问题的解决方法
向数据库插入blob数据实例源码.rar 在mysql中通过。
在使用mysql的过程中,有个问题就是mysql的优化,mysql中longblob字段在5.5版本中默认的为1M。 想改变这个问题,需要注意几点: com.mysql.jdbc.PacketTooBigException: Packet for query is too large (2054817 > ...