MySQLはこのようなUpdateステートメントを書くべきではありません
前置き
本日は、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の書き込み更新文の内容は、スクリプト家の前の記事を検索してくださいまたは次の関連記事を閲覧し続けるあなたは、今後、スクリプト家をよりサポートすることを願っています
関連
-
MySQLのデータバックアップにmysqldumpを使用する方法
-
MySQLにおけるorder byの使用方法の詳細
-
MySQLとOracleの一括挿入SQLの汎用的な記述例
-
SQL集計、グループ化、ソート
-
MySQLデータ型の詳細
-
MySQL サービスとデータベース管理
-
MysqlからElasticsearchにデータを同期させる方法を説明します。
-
Mysql がエラー 1241 を報告 オペランドは 1 つのカラムを含む必要があります。
-
Mysqlデータベースへのリンク時にpymysqlがConnection refusedエラーを報告する
-
msql クエリでのエラー 'where 節' の不明な列 'yellow fruit'
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
MySQLデータベース・インデックスの左端一致の原則
-
ジョイントインデックスのためのmysqlの条件とインデックスが失敗するための条件
-
MySqlの整数インデックスと文字列インデックスの失敗または暗黙の変換問題
-
MySQL演算子(and, or, in, not)の具体的な使用方法
-
SpringBootのMySQLへの接続は、バックエンドのインターフェイスの操作方法を書き込むためのデータを取得するために
-
MySQLデータベースで数百万件のデータを10秒間で挿入
-
[解決済み】マルチパート識別子をバインドできない
-
'INSERT文はFOREIGN KEY制約「FK_TourismReservation_Users」と競合していました。その
-
Djangoマイグレーションエラー 外部キー制約を追加できない
-
MySQLでテーブルを削除します。親行が削除または更新できません: 外部キー制約に失敗しました。