私はこのクエリを持っています:
UPDATE phonecalls
SET Called = "Yes"
WHERE PhoneNumber = "999 29-4655"
私のテーブルはphonecalls
です。PhoneNumber
という名前の列があります。更新したいのは、Called
という列を "yes"に変更することだけです。
私が間違っていることは何か考えていますか?クエリを返すと、影響を受ける行は0と表示されます。
アンフェタミンとYadaが示唆したように、あなたの電話番号が表にあるかどうか、SELECT
で確認してください。
ただし、注意してください:問題の行のcalled
の値がすでに「はい」の場合、mysqlは値を変更しないため、「影響を受ける行はありません」を返します。したがって、called
の現在の値も必ず確認してください
私が観察した影響を受けた行が0になるもう1つの理由:間違ったデータ型。更新する列が整数またはブールで、文字列に設定した場合、列は更新されませんが、エラーも発生しません。
この投稿から他の戦略/アイデアを要約するには:
SELECT
ステートメントを使用して、WHEREが機能し、結果を返すかどうかを確認します。ここにいるGoogleの誰にとっても、この問題は私がCONCAT()
を使用して空のフィールドに追加しようとしたために発生しました。
_UPDATE example SET data=CONCAT(data, 'more');
_
data
がNULL
の場合、CONCAT()
はNULL
を返し(2番目のパラメーターは無視されます)、値は変更されません(NULL
値はNULL
値になる)ため、0行が更新されます。
この場合、代わりにCONCAT_WS()
関数に変更すると、問題が修正されました。
値が同じ場合、MySQLは行を更新しないため(警告またはエラーをトリガーせず)、影響を受ける行数は0になります。
問題は、PhoneNumber == "999 29-4655"
のレコードがないことです。
このクエリを試してください:
SELECT * FROM phonecalls where PhoneNumber = '999 29-4655'
何も返さない場合、一致する行はありません。
私の場合、テキストの列を更新して、切り捨ての問題を修正しようとしていました。正しいテキストに更新しようとすると、0 rows updated
行のテキストが変更されていなかったため。
正しい文字数に対応できるようにテーブル構造の列を拡張すると、目的の結果を確認できました。
それが私の提案です:
UPDATE `phonecalls` SET `Called` = 'yeah!' WHERE `PhoneNumber` = '999 29-4655' AND `Called` != 'yeah!'
また、テーブルとフィールドの名前は大文字と小文字が区別されることを確認してください。
select count(*) from phonecalls where PhoneNumber = "999 29-4655";
を試してください。一致する行の数がわかります。結果が0の場合、データベースに一致する行はありません。
これが何らかの結果を返すことを確認してください。
SELECT * FROM phonecalls WHERE PhoneNumber = '999 29-4655'
フィルターよりも結果が返されない場合WHERE PhoneNumber = '999 29-4655'
は正しくありません。
このあいまいなケースに遭遇しました。このコードは、データベースからレコードのリストを読み取り、列を変更して、それらを1つずつ書き戻します。 UPDATE
のWHERE
句には、2つの条件WHERE key=? AND last_update_dt=?
のみが含まれます。 (タイムスタンプチェックは楽観的ロックのためのものです。レコードを書き込む前に別のプロセスによってレコードが変更された場合、0行が更新され、エラーがスローされます。)
しかし、特定の1つの行でUPDATE
が失敗したため、影響を受けた行はありませんでした。
何度も引っ張った後、行のタイムスタンプが2019-03-10 02:59
であることに気付きました。米国のほとんどでは、そのタイムスタンプは存在しません。夏時間により、時間が2:00から3:00に直接スキップされます。したがって、MySQLからJava MySQLに戻る)の往復中に、コードの一部がそのタイムスタンプを他のタイムスタンプとは異なる方法で解釈し、WHERE
にタイムスタンプを作成したと推測しました句が一致しません。
行のタイムスタンプを1時間変更すると、問題が回避されました。
(もちろん、正しい修正は夏時間を廃止することです。私はJiraを作成しましたが、米国政府はまだそれに対応していません。)