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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 15:33:14