You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java操作MySQL更新两张表时仅单表生效且无报错问题求助

问题排查点

  • 核心问题:orders更新语句未执行
    你的代码中仅调用了sales表对应pst的executeUpdate()方法,orders表对应的pst2仅完成了参数绑定,没有执行语句的逻辑,SQL请求根本没有发送到MySQL,自然不会更新数据。
  • sql2语法不完整
    你定义的sql2语句末尾WHERE条件的Total字段后缺少比较逻辑,示例中语句为:
    String sql2 ="UPDATE `orders` SET `Username`=?,`Total`=? WHERE `Username`=? AND `Total` ";
    
    末尾Total后没有= ?这类匹配规则,属于语法错误,就算后续补充执行逻辑也会抛出SQL异常。
  • 更新逻辑合理性问题
    假设你补全sql2为UPDATE ordersSETUsername=?,Total=? WHERE Username=? AND Total = ?,当前逻辑是用新的Total值去匹配旧的Total值,如果Total值没有变化、或者没有符合用户名+总金额匹配条件的订单,MySQL会返回影响行数为0,不会抛出任何异常,也不会有数据更新。
  • 缺少执行结果校验
    你没有校验executeUpdate()的返回值(该值表示SQL实际影响的行数),也没有针对更新结果做判断,哪怕没有符合条件的记录被更新,代码还是会弹出「Record Updated」的提示,误导你认为操作已经执行成功。
  • 连接与事务风险
    你两次调用dbConnection.getConnection()获取的是独立的数据库连接,若未开启自动提交,可能出现第一个更新提交成功、第二个更新未提交的情况。多表关联更新建议放在同一个事务中执行,要么同时成功要么同时回滚,避免数据不一致。

修正参考代码

DefaultTableModel RecordTable = (DefaultTableModel)jTable1.getModel();
int selectedRow = jTable1.getSelectedRow();
 
String sql ="UPDATE `sales` SET `Username`=?,`Type`=?,`Size`=?,`Unit_Price`=?,`Quantity`=?,`Total`=? WHERE `Type`=?";
// 补全sql2的WHERE条件,这里假设你是要匹配旧的Total值,根据实际业务调整
String sql2 ="UPDATE `orders` SET `Username`=?,`Total`=? WHERE `Username`=? AND `Total` = ?";
Connection conn = null;
try {
    // 同一个事务用同一个连接
    conn = dbConnection.getConnection();
    // 关闭自动提交,开启事务
    conn.setAutoCommit(false);
    
    String type = jComboBox_type.getSelectedItem().toString();
    String size =jComboBox_size.getSelectedItem().toString();
    String qty = jSpinner1.getValue().toString();
    String tot = String.valueOf(total);
    String uprice = String.valueOf(price);
    int grstot = Integer.parseInt(jTextField_finaltot.getText())-Integer.parseInt(RecordTable.getValueAt(selectedRow, 4).toString());
    finaltotal = grstot +total;
    jTextField_finaltot.setText(String.valueOf(finaltotal));
    String u = jTextField_usn.getText();
    
    RecordTable.setValueAt(type,jTable1.getSelectedRow(),0);
    RecordTable.setValueAt(size,jTable1.getSelectedRow(),1);
    RecordTable.setValueAt(uprice,jTable1.getSelectedRow(),2);
    RecordTable.setValueAt(qty,jTable1.getSelectedRow(),3);
    RecordTable.setValueAt(tot,jTable1.getSelectedRow(),4);
    
    // 执行sales更新
    pst = conn.prepareStatement(sql);
    pst.setString(1, u);
    pst.setString(2,type );
    pst.setString(3,size );
    pst.setString(4,uprice);
    pst.setString(5,qty );
    pst.setString(6,tot);
    pst.setString(7, type);
    int salesAffected = pst.executeUpdate();
    
    // 执行orders更新
    pst2 = conn.prepareStatement(sql2);
    pst2.setString(1, u);
    // 注意:这里如果SET的Total是新值,WHERE的应该是旧的Total值,你当前参数传的是同一个tot,逻辑可能有问题,根据实际业务调整
    pst2.setString(2,tot);
    pst2.setString(3,u);
    pst2.setString(4,tot); // 这里如果是旧Total,应该传修改前的数值
    int ordersAffected = pst2.executeUpdate();

    // 提交事务
    conn.commit();
    // 打印影响行数方便排查
    JOptionPane.showMessageDialog(null,String.format("更新成功,sales表影响%d行,orders表影响%d行", salesAffected, ordersAffected));
} catch (SQLException ex) {
    // 出现异常回滚事务
    if (conn != null) {
        try {
            conn.rollback();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
    Logger.getLogger(Pizza_Menu.class.getName()).log(Level.SEVERE, null, ex);
    JOptionPane.showMessageDialog(null,"更新失败:" + ex.getMessage());
} finally {
    // 关闭资源
    if (pst != null) try {pst.close();} catch (SQLException e) {}
    if (pst2 != null) try {pst2.close();} catch (SQLException e) {}
    if (conn != null) try {conn.close();} catch (SQLException e) {}
}

内容的提问来源于stack exchange,提问作者user16686753

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 15:00:02