您当前的位置: 首页 >  sql

梁云亮

暂无认证

  • 3浏览

    0关注

    1211博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

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

梁云亮 发布时间:2019-11-15 22:29:02 ,浏览量:3

0、本博客示例中用到的表结构及数据:

在这里插入图片描述

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));
    }
}
关注
打赏
1665409997
查看更多评论
立即登录/注册

微信扫码登录

0.0436s