执行jdbc事务时获取重复密钥异常

6fe3ivhb  于 2021-06-15  发布在  Mysql
关注(0)|答案(1)|浏览(339)

我尝试使用jdbc事务添加指定和它的薪水。问题是这会引发一个关于重复键的异常。
这是我第一次把一些无效的数据放在工资栏里,之后一切都是正确的。它显示指定id的重复密钥异常,但指定id尚未存储,甚至首次尝试时也未存储。将回滚第一个无效的事务,但在下次存储时它将显示重复密钥异常。
下面是我的code:-

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;
}

这是两个表,我试图添加数据,在我的第一次尝试失败,但没有存储到期回滚

8yoxcaq7

8yoxcaq71#

有两个 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 表的语句,它是主键。
因此,必须检查值(如果是多列键,则检查值)是否违反键的唯一性。

相关问题