欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

MySQL中获取刚插入记录的自增长主键的方法

程序员文章站 2022-07-13 14:09:42
...

MySQL中获取刚插入记录的自增长主键的方法

本博客示例中用到的表结构及数据如下:
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));
    }
}