【问题标题】:Mysql Duplicate entry 'xxxxxxxx' for key(unique) 'xxxxxxxxxx'Mysql重复条目'xxxxxxxx'键(唯一)'xxxxxxxxxx'
【发布时间】:2015-05-22 09:26:40
【问题描述】:

我有一个更新行的问题。我有一个名为serialNumvarchar(50) not null unique default null 的专栏

当我从合作伙伴公司获得响应数据时,我会根据唯一的serial_num(我们公司的序列号)更新该行。

有时更新失败是因为:

Duplicate entry 'xxxxxxxx' for key  'serialNum'

但是当我搜索整个表时,要更新的值不存在。它有时会发生,但并非总是如此,例如 300 次中的 10 次。

为什么会发生这种情况,我该如何解决?

下面是我用来更新的查询:

String updateQuery = "update phone set serialNum=?, Order_state=?, Balance=? where Serial_num=" + resultSet.get("jno_cli");
PreparedStatement presta = con.prepareStatement(updateQuery);
presta.setString(1, resultSet.get("oid_goodsorder"));
presta.setString(2, "order success");
presta.setFloat(3, Float.valueOf(resultSet.get("leftmoney")));
presta.executeUpdate();

【问题讨论】:

  • MySQL 默认不区分大小写。这可能是它发现重复项的原因吗?
  • 还要注意前导/尾随空格
  • 向我们展示您用于更新和搜索的完整查询。
  • 您是自己创建查询还是使用 hibernate 之类的库来创建查询?
  • 是否有两条“Serial_num”相同的记录?如果有,更新最终会将这两条记录的“serialNum”设置为相同的值,从而打破约束。顺便说一句,有一个名为 Serial_num 的列和另一个名为 serialNum 的列听起来像是一场等待发生的灾难。

标签: java mysql


【解决方案1】:

我认为原因在resultSet.get("oid_goodsorder") 你是从哪里得到这个结果的? 'oid_goodsorder' 是独一无二的吗?你总是更新整张桌子吗?
如果 oid_goodsorder 是唯一的,则serialNum 中可能存在重复,因为您不使用批量更新,而是单独更新每条记录,因此可能:

之前:
serialNum=11,22,33,44 oid_goodsorder=44,11,22,33

它首先尝试将serialNum 更新为 44,但 44 是存在的!
但如果你完成所有更新serialNum 将是独一无二的......

  1. 如果您想获取错误行,您可以禁用 set serialNum is not unique 并检查表是否重复 serialNum
  2. 如果您没有重复值,请尝试使用批量更新 Java - how to batch database inserts and updates

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-05
    • 2014-01-12
    • 2016-07-14
    • 2012-08-18
    • 2015-09-13
    • 1970-01-01
    相关资源
    最近更新 更多