MySQL UPDATE行为

时间:2009-05-20 12:29:38

标签: mysql sql mysql-error-1062

的MySQL>更新tablename set fieldname ='C200900674'其中fieldname - 'C200900673';

ERROR 1062(23000):密钥1的重复条目“C200900674-2008-0-1”

对此有何想法或建议?我们有人不小心用减号而不是等号来更新。它显然试图改变所有低于该值的记录?尽管它是字母数字且非常不完整。最重要的是,在获得该错误之前更新了一定数量的记录,并且根本没有任何反馈。没有什么比“查询OK,X行受影响(0.00秒)”所以我们不知道改变了多少。 autocommit = 1因此无法回滚。

无论如何,只是寻找关于此的任何提示或指示。为什么该查询完全任何,它看起来应该向我返回错误。除了明显的答案,不要让没有经验的管理员做一些愚蠢的事情。

2 个答案:

答案 0 :(得分:2)

每当怀疑Mysql如何解释WHERE子句时,请将其反转为SELECT。

SELECT fieldname - 'C200900673' FROM tablename;

SELECT fieldname FROM tablename WHERE fieldname - 'C200900673';

查看第一个选择返回的值以及第二个选择的行。

可悲的是,由于Mysql在数字/字符串转换方面非常松懈,特别是在4.x系列上,甚至在非严格的5.x上,哎呀......即使是严格模式的,也很难确切地知道是什么没有你的Mysql配置的所有细节错误。可能是因为fieldname被转换为某个数字,所以'C200900673'也是如此,基本上是在运行:

update tablename set fieldname = 'C200900674' where NUMBER - NUMBER;

这可以转化为:

update tablename set fieldname = 'C200900674' where 1;

无论如何,我希望你有一个备份!

答案 1 :(得分:0)

如果您的表使用InnoDB存储引擎,则不会造成任何损害。即使使用autocommit = 1,查询也只执行“全有或全无”。 您收到错误消息的事实证明数据库没有触及您的数据。每当出现ERROR时,都会省略“x rows affected”消息。

即使在没有违反uniquess约束的情况下,查询也会因为不同的错误而失败:

  

ERROR 1292(22007):截断   不正确的DOUBLE值:'fieldname'

这是因为减号会导致MySQL尝试计算字段内容的值减去其他内容。这不起作用。你只是没有看到这个错误,因为另一个“首先到达那里”。