转自:http://hi.baidu.com/zuccxy/blog/item/037fb71eebf0848186d6b6cd.html
我们在写数据库程序的时候,经常会需要获取某个表中的最大序号数,
一般情况下获取刚插入的数据的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返回一个列表。
LAST_INSERT_ID
自动返回最后一个 INSERT 或 UPDATE 操作为 AUTO_INCREMENT 列设置的第一个发生的值. 参考这里
The ID that was generated is maintained in the server on aper-connection basis.
LAST_INSERT_ID是基于单个connection的,不可能被其它的客户端连接改变。
可以用SELECTLAST_INSERT_ID(); 查询LAST_INSERT_ID的值.
Important: If you insert multiple rows using a singleINSERT
statement,LAST_INSERT_ID()
returns
the value generated for thefirstinserted rowonly.
使用单INSERT语句插入多条记录,LAST_INSERT_ID只返回插入的第一条记录产生的值. 比如
mysql>INSERTINTOtVALUES(NULL, ‘aaaa’), (NULL,
‘bbbb’), (NULL, ‘cccc’);
mysql>SELECT*FROMt;
+—-+——+
| id |name|
+—-+——+
| 1 | Bob |
| 2 | aaaa |
| 3 | bbbb |
| 4 | cccc |
+—-+——+
mysql>SELECTLAST_INSERT_ID();
+——————+
|LAST_INSERT_ID() |
+——————+
| 2 |
+——————+
ID 2 是在插入第一条记录aaaa 时产生的.
LAST_INSERT_ID是与table无关的,如果向表a插入数据后,再向表b插入数据,LAST_INSERT_ID会改变。
一般情况下获取刚插入的数据的id,使用select max(id) from table 是可以的。
但在多线程情况下,就不行了。在多用户交替插入数据的情况下max(id)显然不能用。
这就该使用LAST_INSERT_ID了,因为LAST_INSERT_ID是基于Connection的,只要每个线程都使用独立的Connection对象,LAST_INSERT_ID函数将返回该Connection对AUTO_INCREMENT列最新的insert or update操作生成的第一个record的ID。这个值不能被其它客户端(Connection)影响,保证了你能够找回自己的
ID 而不用担心其它客户端的活动,而且不需要加锁。
(3)select @@IDENTITY:
String sql=”select @@IDENTITY”;
@@identity是表示的是最近一次向具有identity属性(即自增列)的表插入数据时对应的自增列的值,是系统定义的全局变量。一般系统定义的全局变量都是以@@开头,用户自定义变量以@开头。比如有个表A,它的自增列是id,当向A表插入一行数据后,如果插入数据后自增列的值自动增加至101,则通过select @@identity得到的值就是101。使用@@identity的前提是在进行insert操作后,执行select
@@identity的时候连接没有关闭,否则得到的将是NULL值。
相关推荐
一张表,里面有ID自增主键,当insert了17条记录之后,删除了第15,16,17条记录,再把Mysql重启,再insert一条记录,这条记录的ID是18还是15 还是MYSQL的,一张表有还是有ID自增主键,用JDBC insert一条语句之内,怎么在JAVA...
介绍了Java获取最后插入MySQL记录的自增ID值的3种方法,有需要的朋友可以参考需要
mysql插入记录防止乱码,这是我在编程时通过网上下载来的资料,解决了我用VFP或者JAVA插入记录的问题。
mybatis 获取mysql插入记录的自增长字段值
主要介绍了Python3 操作 MySQL 插入一条数据并返回主键 id的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
mysql innodb类型数据库表 根据ibd文件获取表 space id,用于恢复innodb类型数据表数据
该资源主要实现如下功能,利用poi获取excel中大量数据,然后利用jdbc批量插入到mysql
易语言源码易数据库插入空记录的几种思路.rar 易语言源码易数据库插入空记录的几种思路.rar 易语言源码易数据库插入空记录的几种思路.rar 易语言源码易数据库插入空记录的几种思路.rar 易语言源码易数据库插入空...
mysql中插入多text类型问题,可以让mysql数据库插入多个大存储类型
MySQL创建存储过程批量插入10万条数据 存储过程 1、首先防止主键冲突,我们清空表。 TRUNCATE table A_student; 2、编写存储过程 delimiter ‘$’; CREATE PROCEDURE batchInsert(in args int) BEGIN declare i int ...
一、使用语句: 复制代码 代码如下:mysql_query(“select max(id) from t1”,$link); 使用此方法得到的是 id最大的值,确为最后一个值,但当...//$getID即为最后一条记录的ID //此函数的使用条件: //1.假设字段名称
从MySQL获取ip,是一套非常适用的命令组成
通过阅读和实践这个文档,您将能够更好地掌握MySQL数据库中插入数据的操作方法,以及如何在表中添加新的记录。无论是初学者还是有经验的用户,都可以通过本文档来加深对MySQL DML插入操作的理解和应用。
是在vs中查询和插入MySQL语句如果表没有建立关系可以参考看看
单条数据记录的插入;;单条数据记录的插入;● VALUES子句:包含各列需要插入的数据清单,数据的顺序要与列的顺序相对应。若表名后不给出列名,则在VALUES子句中要给出每一列(除IDENTITY和timestamp类型的列)的值,...
防止mysql重复插入记录的方法有很多种,常用的是ignore,Replace,ON DUPLICATE KEY UPDATE,当然我们也可以在php中加以判断了。 方案一:使用ignore关键字 如果是用主键primary或者唯一索引unique区分了记录的唯一性,...
Django2+ MySQL8 数据插入和查询 Django2+ MySQL8 数据插入和查询
mysql 批量插入测试数据 ,可判断条件插入数据,随心所遇插入,do where 循环
本文实例讲述了mysql获取group by总记录行数的方法,分享给大家供大家参考。具体方法分析如下: 一般来说,mysql获取group by内部可以获取到某字段的记录分组统计总数,而无法统计出分组的记录数。 mysql中可以使用...
java 利用 jdbc 向 mysql 数据库插入记录并返回插入记录生成的主键值