2009-05-20 7 views
1

mysql> tablename set fieldname = 'C200900674' where fieldname - 'C200900673';MySQL UPDATEの動作

ERROR 1062(23000):この上のキー1人の

任意の考えや提案のための重複エントリ 'C200900674-2008-0-1'?誰かに誤って等号の代わりにマイナス記号を付けて更新をさせました。明らかに、すべてのレコードをその値よりも小さく変更しようとしましたか?英数字であり、実際にはかなり不完全ですが。その上に、そのエラーが発生する前にある量のレコードが更新され、フィードバックがまったくありませんでした。 「クエリOK、X行が影響を受けました(0.00秒)」のようなものはありませんでした。 autocommit = 1のため、ロールバックする機能はありません。

とにかく、これに関するヒントやポインタを探しています。なぜそのクエリが何かをやったのですが、それは本当に私にエラーを返したはずです。経験の浅い管理者には骨が抜けていることはもちろんありません。

答えて

0

テーブルがInnoDBストレージエンジンを使用している場合、弊害はありませんでした。自動コミット= 1の場合でも、クエリは「すべてかどうか」でのみ実行されます。 ERRORメッセージを受け取ったという事実は、DBがあなたのデータに触れていないという証拠です。エラーが発生するたびに、 "x rows affected"メッセージは省略されます。がユニーク制約がクエリを侵害されなかったであろう場合であっても

は異なるエラーで失敗しましたでしょう:

ERROR 1292 (22007): Truncated incorrect DOUBLE value: 'fieldname'

これはマイナス記号は、MySQLがしようとするとの値を計算させていたので、フィールドの内容から何か他のものを取り除く。これは動作しません。このエラーが表示されないのは、もう一方が「最初に」あるためです。

+1

テーブルはINNODBにあり、明らかに私たちはレコードの量が変更されたことを経験しました。私が今までに明らかにしたすべての証拠はそれを指摘しています。バイナリログはこのボックスで有効になり、 "mysqlbinlog -s {logfile} | grep -i {そのレコードの一意の識別子}"が含まれていました。 FWIWはupdate文*もbinlogに記録されていました。私はこれを試してみるつもりで、おそらくテストDBといくつかのテーブルを作成し、制御された環境でそれを再現しようとします。ありがとう... – wdingus

+0

あなたの例の文字列は本当ですか?私は 'C200900674'の代わりに '200900674C'や '2009C00674C'のようなものがある、つまり数字で始まっていると、これが起こっているのを見ることができます。 –

+0

はい、私が変更したのはテーブルとフィールドの名前だけでした。 – wdingus

2

MysqlがWHERE句をどのように解釈するのか疑問がある場合は、それをSELECTに戻してください。

SELECT fieldname - 'C200900673' FROM tablename; 

そして:

SELECT fieldname FROM tablename WHERE fieldname - 'C200900673'; 

第1の選択、2つ目は何を見つけるの行によって返されるどの値を参照してください。

悲しいことに、Mysqlは数値/文字列の変換で特に控えめなので、特に4.xシリーズでは、厳密ではない5.xであっても...厳密に改変されていても、あなたのMySQLの設定のすべての詳細なしで間違っていた。

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

に変換することができた:とにかく

update tablename set fieldname = 'C200900674' where 1; 

、私はあなたがバックアップを持っていることを望みますフィールド名が一部の数値にキャストし、その「C200900673は」でした、基本的に実行していたので、それはかもしれません!