1. ホーム
  2. データベース
  3. マイサク

MySQLはこのようなUpdateステートメントを書くべきではありません

2022-01-06 14:15:07

前置き

本日は、MySQL の古典的な落とし穴をご紹介します。MySQL の UPDATE 文は、決してこのように書いてはいけません!

原因

最近、何度か開発者仲間から、次のような質問をピンで受けることがあります。

問題は以下のように集約されます:MySQLで行を更新する、構文は正しいが、行は更新されない...。

結論 UPDATE文において、複数のフィールドを更新する場合、フィールドはカンマで区切らず、"AND"で区切る必要があります。

現象

最初にこの問題に遭遇したとき、この文を入手してテストライブラリ内で直接実行したところ、確かに問題があることがわかりましたが、やはり開発者の説明とは違っていたので、ここではテストデータでシミュレーションしてみました。

問題のSQL文です。

update apps set owner_code='43212' and owner_name='Li Si' where 
owner_code='13245' and owner_name='Zhang San';



実行前のレコードは次のようになります。

実行後のレコードは次のようになります。

ご覧のように、この仲間の開発者が言ったように、結果は "まるで機能していない"ではなく、実は次のようになっているのです。

<ブロッククオート

owner_nameの値は変わりませんが、owner_codeが0になっています!?

なぜ?

構文には全く問題がないようで、更新構文に関する MySQL の公式ドキュメントに目を通したところ

assignment_list のフォーマットが col_name=value のカンマ区切りリストであることを見れば、開発学生が望んでいたマルチフィールドの更新文は次のように書くべきであることがすぐにわかりました。

update apps set owner_code='43212' , owner_name='Li4' where 
owner_code='13245' and owner_name='Zhang San'; 


巻き戻し、再テストを一握り。

案の定、これで期待通りの結果が得られました

まとめ:UPDATE文において、複数のフィールドを更新したい場合は、フィールドをカンマで区切らず、"AND"で区切ってください。

追記です。後日、時間があったので、フィールドの区切りに "AND" を使用すると owner_code=0 という奇妙な結果になる理由を調べてみたところ、以下のようなことがわかりました。

何度か試した結果、以下のことがわかりました。

update apps set owner_code='43212' and owner_name='Li Si' where 
owner_code='13245' and owner_name='Zhang San'; 



に相当する。

update apps set owner_code=('43212' and owner_name='Li Si') where 
owner_code='13245' and owner_name='Zhang San'; 


そして、('43212' and owner_name='Li Si')は論理式で、ここでown_nameが'Li Si'でないことは難しくないでしょう。

したがって、この論理式の結果は false であり、false は MySQL では 0 と同じです!

要約

この記事は、MySQLはこのように更新文を書いてはいけないに導入され、より関連するMySQLの書き込み更新文の内容は、スクリプト家の前の記事を検索してくださいまたは次の関連記事を閲覧し続けるあなたは、今後、スクリプト家をよりサポートすることを願っています