MySQLはこのような更新文を決して書きません

MySQLはこのような更新文を決して書きません

序文

今日は、非常に典型的な MySQL の「落とし穴」についてお話しします。 MySQL の UPDATE ステートメントは、このように記述しないでください。

原因

最近、いくつかの開発者が DingTalk で次のような質問をしてきました。

問題は次のように要約できます: MySQL でレコードを更新する場合、構文は正しいのですが、レコードは更新されません...

結論: UPDATE ステートメントで複数のフィールドを更新する場合、フィールド間で「AND」を使用することはできません。カンマで区切る必要があります。

現象

この問題に初めて遭遇したとき、私はこのステートメントを取得してテスト ライブラリで直接実行しました。確かに問題があることがわかりましたが、開発の説明とは依然として異なっていました。ここでは、テスト データを使用してシミュレートします。

問題のある SQL ステートメント:

アプリを更新して、owner_code='43212'、owner_name='李四'を設定します。 
owner_code='13245' かつ owner_name='张三';

実行前の記録は次のとおりです。

実行後の記録は以下のとおりです。

ご覧のとおり、結果は開発者が言ったように「効果がないようだ」というわけではなく、実際には効果があります。

owner_name の値は変更されませんでしたが、owner_code は 0 になりました。

なぜ?分析

構文に問題はないようです。MySQL の公式ドキュメントで更新構文を調べてみました。

assignment_list の形式が col_name=value のカンマ区切りリストであることから、開発者が求めていた複数フィールドの更新ステートメントは次のように記述する必要があることがすぐにわかりました。

アプリを更新し、owner_code='43212'、owner_name='李四'を設定します。 
owner_code='13245' かつ owner_name='张三'; 

戻ってもう一度試してください:

案の定、今回は希望通りの結果が得られました!

概要: UPDATE ステートメントで複数のフィールドを更新する場合、フィールド間で「AND」を使用することはできません。フィールドをコンマで区切る必要があります。

追記:後日時間ができたので振り返ってみると、なぜ「AND」で区切ったのにowner_code=0という変な結果が出たのか不思議に思いました。

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

アプリを更新して、owner_code='43212'、owner_name='李四'を設定します。 
owner_code='13245' かつ owner_name='张三'; 

は以下と同等です:

アプリを更新して、owner_code=('43212' and owner_name='李四') を設定します。 
owner_code='13245' かつ owner_name='张三'; 

そして、('43212' and owner_name='李四') は論理式であり、owner_name が '李四' ではないことは容易にわかります。

したがって、この論理式の結果は false となり、MySQL では 0 に相当します。

要約する

これで、MySQL で更新ステートメントを絶対に記述しない方法に関するこの記事は終了です。MySQL で更新ステートメントを記述する方法の詳細については、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • mysql update ステートメントの詳細な使用方法
  • Mysql クロステーブル更新マルチテーブル更新 SQL ステートメントの概要
  • mysql SELECT FOR UPDATE 文の使用例
  • MySQL UPDATE ステートメントの詳細な説明
  • 更新ステートメントが正常に実行されたかどうかを判断する PHP+MySQL メソッド
  • MySQL で UPDATE ステートメントを使用する例のチュートリアル
  • SQL文はMySQL更新の正しい使い方を詳しく説明します
  • MySQLデータベースの挿入および更新ステートメントの詳細な説明
  • mysql update文の実行プロセスの詳細な説明
  • MySQL 更新ステートメントの正しい使用方法

<<:  この記事ではCSSボーダーの使い方を説明します

>>:  HTML 基本ノート (推奨)

推薦する

Nginx 環境での WordPress マルチサイト構成の詳細な説明

WordPress のマルチサイト機能を使用すると、1 つの WordPress プログラムをインス...

ECMAScript のイテレータの詳細な説明

目次序文以前のバージョンイテレータパターンイテレータファクトリ関数イテレータプロトコル最後に序文多く...

ウェブサイトのテキストはまだデザインする必要がありますか?

多くの人が、ウェブサイト上のテキストはデザインする必要があるのか​​と疑問に思うかもしれません。多く...

Vue.js を学ぶ際に遭遇する落とし穴

目次クラス void のポイントES6 矢印関数ヴュートファイvue-cli非同期と同期実行と展開ヒ...

Linux でファイル権限を変更する chmod コマンドの詳細な分析

Linux chmodコマンドを使用して、ターゲット ファイルにアクセス、読み取り、書き込み、または...

MySQL 8.0 再帰クエリの簡単な使用例

序文この記事では、MySQL 8.0 の新機能を使用して再帰クエリを実装します。詳細なサンプル コー...

VMware 仮想マシンでの CentOS7 ネットワーク構成 (ホストのワイヤレス インターネット アクセス)

CentOS7 システムを使用するのは今回が初めてで、ネットワーク構成を行う際に多くの問題が発生し...

Bootstrap 3.0 学習ノート CSS関連補足

この記事の主な内容は次のとおりです。 1. ブラウザのサポート2. 画像3. レスポンシブツール4....

Spring Boot Docker パッケージング ツールの概要

目次スプリングブートDocker spring-boot-maven-プラグインSpotify Ma...

HTML の基本 - CSS スタイルシート、スタイル属性、フォーマット、レイアウトの詳細

1.位置:固定一部の Web サイトの右下隅にあるポップアップ ウィンドウなどの、ブラウザーを基準と...

HTML でナンバープレート番号と州の略語を入力するためのサンプルコード

原理としては、まずボタン付きの div を記述し、次に画面のサイズに応じて自動的に適応してキーボード...

JavaScript スコープチェーンの基本原理のグラフィカルな説明

目次序文範囲1. スコープとは何ですか? 2. [[スコープ]] プロパティ3. スコープチェーン4...

Docker Compose を使用して nginx のロード バランシングを実装する方法

Dockerネットワーク管理とコンテナIP設定に基づいてNginxロードバランシングを実装するすべて...

CentOS8 でローカル yum ソースを構成するための詳細なチュートリアル

centos8 ディストリビューションは、BaseOS および AppStream リポジトリを通じ...

CSS 表示属性のインラインブロックレイアウト実装の詳細な説明

CSS 表示プロパティ注: !DOCTYPE が指定されている場合、Internet Explore...