MySQL中获取刚插入记录的自增长主键的方法
程序员文章站
2022-07-13 14:09:42
...
MySQL中获取刚插入记录的自增长主键的方法
本博客示例中用到的表结构及数据如下:
1、 使用ResultSet的getGeneratedKeys()方法(建议)
public static void main(String[] args) throws SQLException {
Connection conn = getConnection();
String sql = "insert into tb_dept (dname,loc) values('a','aaaa')";
PreparedStatement ps = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
ps.executeUpdate();
ResultSet rs = ps.getGeneratedKeys();
if(rs.next()){
System.out.println(rs.getLong(1));
}
}
2、使用存储过程
-
创建存储过程
DELIMITER $$ DROP PROCEDURE IF EXISTS `proc_insertDept` $$ CREATE PROCEDURE `proc_insertDept`(in dname varchar(14),in loc varchar(13),out oid int) BEGIN insert into tb_dept(dname,loc) values(dname,loc); select max(deptno) from tb_dept into oid; select oid; END $$ DELIMITER ; call proc_insertDept('b','bbbb',@id);
-
测试代码
public static void main(String[] args) throws SQLException { Connection conn = getConnection(); String sql = "insert into tb_dept (dname,loc) values('a','aaaa')"; CallableStatement cs = conn.prepareCall("{call proc_insertDept(?,?,?)}"); cs.setString(1, "c"); cs.setString(2, "cccc"); cs.registerOutParameter(3, Types.INTEGER); cs.execute(); System.out.println(cs.getInt(3)); }
3、使用系统定义的全局变量@@identity
public static void main(String[] args) throws SQLException {
Connection conn = getConnection();
String sql = "insert into tb_dept (dname,loc) values('a','aaaa')";
PreparedStatement ps = conn.prepareStatement(sql);
ps.executeUpdate();
ResultSet rs = ps.executeQuery("select @@identity ");
if(rs.next()){
System.out.println(rs.getLong(1));
}
}
4、使用LAST_INSERT_ID()
在多用户交替插入数据的情况下max(id)不能用。
LAST_INSERT_ID 是与table无关的,如果向表a插入数据后,再向表b插入数据,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 返回一个列表。
注意:如果你一次插入了多条记录,这个函数返回的是第一个记录的ID值。
public static void main(String[] args) throws SQLException {
Connection conn = getConnection();
String sql = "insert into tb_dept (dname,loc) values('a','aaaa')";
PreparedStatement ps = conn.prepareStatement(sql);
ps.executeUpdate();
ResultSet rs = ps.executeQuery("select last_insert_id()");
if(rs.next()){
System.out.println(rs.getLong(1));
}
}
上一篇: 循环语句与嵌套
推荐阅读