在执行JDBC事务时获取重复的密钥异常

时间:2018-12-16 07:26:35

标签: java mysql jdbc

我正在尝试使用JDBC事务添加名称及其薪水。 问题在于这引发了关于重复键的异常。

这是我第一次在薪水列中输入一些无效数据,然后一切都正确了。它显示指定ID的重复键异常 但是指定ID尚未存储,甚至没有初次尝试。 第一个无效的事务将回滚,但在下一次存储时将显示重复的密钥异常。

以下是我的代码:-

  public boolean addDesignation(ObservableList nodeList) throws SQLException {
        Connection demo = getConnection();
        demo.setAutoCommit(false);
        Savepoint savePoint = demo.setSavepoint("savePoint");
        try {
        PreparedStatement addDesig =  demo.prepareStatement(
                "INSERT INTO `designation`(`desig_id`,`dept_id`,`desig_name`,`desig_desc`) VALUES (?,?,?,?)");
        PreparedStatement addSal =  demo.prepareStatement("INSERT INTO `salary` "
                + "(`desig_id`, `basic`, `house_rent`, `conveyance`, `medical`, `dearness`,`others_allowances`,"
                + " `income_tax`, `pro_tax`, `emp_state_insu`, `absence_fine`, `others_deductions`, `month`)"
                + " VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?)");

        addDesig.setString(1 , nodeList.get(0).toString());
        addDesig.setString(2,  nodeList.get(1).toString());
        addDesig.setString(3, nodeList.get(2).toString());
        addDesig.setString(4,  nodeList.get(3).toString());
        addDesig.executeUpdate();

        addSal.setString(1, nodeList.get(0).toString());
        addSal.setInt(2, Integer.parseInt(nodeList.get(4).toString()));
        addSal.setInt(3, Integer.parseInt(nodeList.get(5).toString()));
        addSal.setInt(4, Integer.parseInt(nodeList.get(6).toString()));
        addSal.setInt(5, Integer.parseInt(nodeList.get(7).toString()));
        addSal.setInt(6,Integer.parseInt(nodeList.get(8).toString()));
        addSal.setInt(7,Integer.parseInt(nodeList.get(9).toString()));
        addSal.setInt(8, Integer.parseInt(nodeList.get(10).toString()));
        addSal.setInt(9, Integer.parseInt(nodeList.get(11).toString()));
        addSal.setInt(10, Integer.parseInt(nodeList.get(12).toString()));
        addSal.setInt(11, Integer.parseInt(nodeList.get(13).toString()));
        addSal.setInt(12, Integer.parseInt(nodeList.get(14).toString()));
        addSal.setString(13, nodeList.get(15).toString());
        addSal.executeUpdate();
         demo.commit();

         return true;

    } catch (SQLException ex) {
        demo.rollback(savePoint);

        Logger.getLogger(DatabaseHandler.class.getName()).log(Level.SEVERE, null, ex);
    }

    return false;
}

these are two tables and im trying to add that data in my first attempt failed but not store due roll back

1 个答案:

答案 0 :(得分:0)

您的代码中有2条INSERT语句。
designation表的第一个:

"INSERT INTO `designation`(`desig_id`,`dept_id`,`desig_name`,`desig_desc`) VALUES (?,?,?,?)"

在这里看起来desig_id是主键(也许是自动增量,在这种情况下,您根本不能提供任何值)。
您确定为该列提供的值在表格中不存在吗?

salary表的第二个:

"INSERT INTO `salary` " + "(`desig_id`, `basic`, `house_rent`, `conveyance`, `medical`, `dearness`,`others_allowances`," + " `income_tax`, `pro_tax`, `emp_state_insu`, `absence_fine`, `others_deductions`, `month`)" + " VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?)"

在这种情况下,由于您没有发布表的CREATE语句(这是主键),因此不清楚。
因此,您必须检查该值(如果为多列键,则为值)是否违反了键的唯一性。