【问题标题】:Checking duplicate insertions in MySQL检查 MySQL 中的重复插入
【发布时间】:2017-01-12 08:16:09
【问题描述】:

MySQL output has duplicate inputs

我在使用 MySQL 时遇到问题,其中重复的输入被插入到我创建的表中,我使用 JSP 和 Servlet 在 WebApp 中实现了一个数据库。

例如,当我在表单中输入以下内容时: 员工姓名:Kylo Ren 代码:A 销售额:3000

只需提交一次表单,它就会生成 3 个不同的行。

public void computeGross(Connection connection){

    switch(employeeCode){
    case "A":
        setGross(grossA+(getEmployeeSales()*grossSalesA));
        break;
    case "B":
        setGross(grossB+(getEmployeeSales()*grossSalesB));  
        break;
    case "C":
        setGross(grossC+(getEmployeeSales()*grossSalesC));  
        break;
    }   
    insertRecord(connection);
}

//compute for the commission, if sales>2500; commission=7.5% of sales
public void computeCommission(Connection connection){       

    if(employeeSales>2500)
        setCommission(getEmployeeSales()*commissionVal);
    else {
        setCommission(0);
    }

    insertRecord(connection);

}

//compute takehome pay, takehome pay = summation of gross and commission

public void computeTakeHomePay(Connection connection){


    setResult(getGross()+getCommission());

    insertRecord(connection);

}

private void insertRecord(Connection conn){

    try{
        String sql="insert into MachineProblem1(EmployeeName, EmployeeCode, EmployeeSales, EmployeeGross, EmployeeCommission, EmployeeResult)"+ "values(?,?,?,?,?,?)";

        PreparedStatement pstmnt= conn.prepareStatement(sql);
        pstmnt.setString(1, employeeName);
        pstmnt.setString(2, employeeCode);
        pstmnt.setDouble(3, employeeSales);
        pstmnt.setDouble(4, gross);
        pstmnt.setDouble(5, commission);
        pstmnt.setDouble(6, result);

        //now commit to database
        pstmnt.executeUpdate();

    }catch(SQLException sqle){
        sqle.printStackTrace();
    }

}

// get records

public ResultSet getAllRecords(Connection conn){
    ResultSet records = null;
    try{
        String sql="select*from MachineProblem1";

        PreparedStatement pstmnt= conn.prepareStatement(sql);

        records= pstmnt.executeQuery();


    }catch(SQLException sqle){
        sqle.printStackTrace();
    }
    return records;
}

【问题讨论】:

  • 截图中没有一条记录是重复的。请澄清您的问题。
  • 我觉得很干净
  • 我的意思是当我提交一个像员工姓名:Kylo Ren 代码:A 销售额:3000 这样的表格时,它总是在数据库表中分成三行,就像在图片中我只放一次 Kylo Ren但是有 3 排不同的 Kylo Ren 出来了。
  • 这些是 3 个不同的行。看看 Kylo Ren 的 3 个钱栏
  • 因此,您需要在所有进行这些调用的地方都记录下来,并进行更好的调试。无论您在哪里准备对insert into MachineProblem1 的调用,都会将该事实记录到带有时间戳的文本文件中。那些不是骗子,有些东西把不同的 moolah 值放在那里

标签: java mysql jsp servlets


【解决方案1】:

insertRecord方法中,sql查询是为了插入,所以每次调用方法时,都会插入新的记录。
=========================
问题出在insertRecord 方法中,您正在从所有其他三种方法中调用insertRecord 方法,例如computeGrosscomputeTakeHomePaycomputeCommissioninsertRecord 方法内部,问题出在这一行:

String sql="insert into MachineProblem1(EmployeeName, EmployeeCode, EmployeeSales, EmployeeGross, EmployeeCommission, EmployeeResult)"+ "values(?,?,?,?,?,?)";

它在数据库中插入三条记录,因为它调用了该方法体三次。

如果您想解决这个问题,我建议您创建一个新方法updateRecord,您将在其中更新先前插入的记录。 并更改您的代码,无论您第一次调用哪个方法,它都会调用insertRecord 方法,而其他方法调用updateRecord 方法。所以,条目没有被插入三次,它只更新前一个条目。

【讨论】:

    【解决方案2】:

    从结果来看,你应该从计算方法中删除insertRecord(connection)方法调用,并在计算完成后才调用insertRecord(connection)

    或者,您可以使用Insert ... On Duplicate Update SQL 代替,方法是检查键是否已存在。

    MySQL: INSERT ... On Duplicate Update

    【讨论】:

      猜你喜欢
      • 2011-02-03
      • 2011-12-04
      • 1970-01-01
      • 2016-09-27
      • 2016-06-27
      • 2023-04-02
      • 1970-01-01
      • 2023-03-19
      相关资源
      最近更新 更多