问题来源:更新数据表中所有记录的Id时,出现Duplicate entry ‘0’ for key ‘PRIMARY’错误。
因为同一个表里有不同用户存储的数据,不同的外键。
更新主键时出现错误。
错误提示:
com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry ‘1’ for key ‘PRIMARY’
分析:
(1)主键Id已经设为自动增长了;
可能是字段pid为primary key且auto_increment属性,不能出现重复值。
(2)有数据写入破坏了数据表。
找到根源:
由于在更新id的操作里先读出了id数据,数据排序不是按照升序排列的,因此再重新改写时会出现冲突。
解决方法:sql语句中使用order by。
http://database.51cto.com/art/201108/284083.htm
ORDER BY子句按一个或多个(最多16个)字段排序查询结果,可以是升序(ASC)也可以是降序(DESC),缺省是升序。ORDER子句通常放在SQL语句的最后。 ORDER子句中定义了多个字段,则按照字段的先后顺序排序。
String str = "select DutyleaderId from dutyleader order by DutyleaderID";
rs = stmt.executeQuery(str);
List<Integer> idlist = new ArrayList<Integer>();
while (rs.next()) {
idlist.add(rs.getInt("DutyleaderId"));
}
if (idlist != null && idlist.size() > 0) {
//stmt一定要关闭
stmt.close();
stmt = con.createStatement();
for (int i = 0; i < idlist.size(); i++) {
//System.out.print(idlist.get(i));
str = "update dutyleader set DutyleaderID='" + (i+1) + "' where DutyleaderID=" + idlist.get(i);
stmt.executeUpdate(str);
}
//System.out.print("\n");
}
这样就不会出现主键冲突了。