NetBeans更新数据未修改ID仍报主键重复'10'错误排查
报错原因说明
你遇到的key duplicate '10' for 'primary'是主键约束冲突报错,本质是执行SQL时尝试将表中某条记录的主键值修改为已经存在的10,违反了主键唯一不可重复的规则。
这个报错不是因为你主动修改了ID字段,是代码写法错误导致SQL语义被篡改,意外修改了主键值。
代码存在的逻辑问题
- 预编译参数数量不匹配
你写的UPDATE语句中只有3个?占位符,对应nama_sumber、alamat_sumber、kapasitas_sumber三个更新字段,但后续调用ps.setString()一共传入了4个参数,多余的参数会直接干扰SQL结构。 - 字段和参数映射完全错位
第一个占位符对应nama_sumber(来源名称)字段,你却传入了txt_id.getText()(ID输入框内容);后续地址、产能字段的传值也全部和字段顺序错开,没有对应上。 - WHERE条件使用字符串拼接,存在SQL注入/语义错乱风险
你直接把kodegudang变量拼接到SQL语句中,没有使用预编译占位符,只要变量中包含单引号等特殊字符,就会破坏原有SQL结构,结合你多传的第4个参数,会意外把id_sumber主键字段加入更新逻辑,把主键值改成其他已存在的值,触发主键重复报错。 - 执行逻辑顺序颠倒
你在调用ps.executeUpdate()真正执行数据库操作之前,就弹出了“编辑成功”的提示,哪怕后续SQL执行报错、更新失败,用户也会收到操作成功的错误提示。 - 资源操作缺少异常和结果判断
代码没有判断更新操作影响的行数,也没有做异常捕获,无法感知更新失败、未匹配到对应记录等异常场景。
修正后的参考代码
// 所有动态传值全部改用?占位符,避免字符串拼接问题 String SQL = "update sumber set nama_sumber=?, alamat_sumber=?, kapasitas_sumber=? WHERE id_sumber=?"; ps = conn.prepareStatement(SQL); // 严格按照占位符顺序传值,保证字段和参数一一对应 ps.setString(1, txt_nama.getText()); // 对应nama_sumber字段,传名称输入框内容 ps.setString(2, txt_alamat.getText()); // 对应alamat_sumber字段,传地址输入框内容 ps.setString(3, kapasitasdos.getText());// 对应kapasitas_sumber字段,传产能输入框内容 ps.setString(4, kodegudang); // 对应WHERE条件的id_sumber,传要更新的记录主键 // 先执行SQL,再根据执行结果弹出对应提示 int affectedRows = ps.executeUpdate(); if (affectedRows > 0) { JOptionPane.showMessageDialog(null, "Sumber Air berhasil Diedit"); } else { JOptionPane.showMessageDialog(null, "更新失败,未查询到对应记录"); } // 后续需要补充异常捕获、数据库资源释放逻辑
内容的提问来源于stack exchange,提问作者Martinus Robinson Sumitro
相关产品推荐
相关产品推荐

