为什么一直跳主键报错 299999是最大值吗?主键是没数据的

为什么一直跳主键报错 299999是最大值吗?主键是没数据的

package com.imooc.jdbc.sample;

import com.imooc.jdbc.hrapp.common.DbUtils;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Date;

public class BatchSample {
    private static void tc1(){
        Connection conn = null;
        PreparedStatement pstmt = null;
        int num=0;
        try {
            long startTime = new Date().getTime();
            conn = DbUtils.getConnection();
            conn.setAutoCommit(false);
            String sql = "insert into employee(eno,ename,salary,dname) values(?,?,?,?)";
            for (int i = 100000;i < 200000;i ++){
                pstmt = conn.prepareStatement(sql);
                pstmt.setInt(1,i);
                pstmt.setString(2,"员工"+i);
                pstmt.setFloat(3,4000f);
                pstmt.setString(4,"市场部");
                num = pstmt.executeUpdate()+num;
            }
            if (num != 0){
                System.out.println("成功"+num);
            }else {
                System.out.println("失败"+num);
            }
            conn.commit();
            long endTime = new Date().getTime();
            System.out.println(endTime-startTime);
        } catch (Exception e) {
            e.printStackTrace();
            try {
                if (conn != null && !conn.isClosed()){
                    conn.rollback();
                }
            } catch (SQLException ex) {
                e.printStackTrace();
            }
        }finally {
            DbUtils.closeConnection(null,pstmt,conn);
        }
    }

    private static void tc2(){
        Connection conn = null;
        PreparedStatement pstmt = null;
        int num=0;
        try {
            long startTime = new Date().getTime();
            conn = DbUtils.getConnection();
            conn.setAutoCommit(false);
            String sql = "insert into employee(eno,ename,salary,dname) values(?,?,?,?)";
            for (int i = 200000;i < 300000;i ++){
                pstmt = conn.prepareStatement(sql);
                pstmt.setInt(1,i);
                pstmt.setString(2,"员工"+i);
                pstmt.setFloat(3,4000f);
                pstmt.setString(4,"市场部");
                num = pstmt.executeUpdate()+num;
                pstmt.addBatch();
            }
            if (num != 0){
                System.out.println("成功"+num);
            }else {
                System.out.println("失败"+num);
            }
            pstmt.executeBatch();
            conn.commit();
            long endTime = new Date().getTime();
            System.out.println(endTime-startTime);
        } catch (Exception e) {
            e.printStackTrace();
            try {
                if (conn != null && !conn.isClosed()){
                    conn.rollback();
                }
            } catch (SQLException ex) {
                e.printStackTrace();
            }
        }finally {
            DbUtils.closeConnection(null,pstmt,conn);
        }
    }

    public static void main(String[] args) {
        tc1();
        tc2();
    }
}

https://img1.sycdn.imooc.com/climg/66cef4860969fe4709560462.jpg


下载视频
投屏
复制链接

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

1回答
好帮手慕小蓝 2024-08-29 09:57:16

同学你好,报错信息中的“Duplicate”是指“299999”这个主键重复了,建议同学查看一下数据库中的数据。

祝学习愉快~

  • 提问者 鱿鱼三明治 #1
    不是 我解决了 是executeupdate方法没删 删了之后正常了 这个是为什么呢?
    2024-08-29 15:10:17
  • 好帮手慕小蓝 回复 提问者 鱿鱼三明治 #2

    同学你好,执行流程和之前同学的问答中是一样的,循环只有最后一次才会尝试被提交,但是提交之前可以看到,pstmt.executeBatch();语句尝试添加299999为主键的数据,而pstmt.addBatch();也尝试299999为主键的数据。当执行conn.commit();时,两个299999为主键的数据互相重复,就会报这个错误了。

    祝学习愉快~

    2024-08-29 15:29:08
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
Java工程师 2024版
  • 参与学习       2020    人
  • 提交作业       1249    份
  • 解答问题       1202    个

2024重磅革新,超百小时内容豪华升级,加速提升高级技能与高薪就业竞争力 课程紧贴企业最新人才需求,历经7年持续迭代,帮助万名学子入行转行 从零起点到高阶实战,学习路径稳健顺滑,成就从小白到工程师高薪

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师