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 基本ノート (推奨)

推薦する

MySQL インデックス データ構造の詳細な分析

目次概要インデックスデータ構造バイナリツリー赤黒木BツリーB+ツリーハッシュ索引InnoDB インデ...

DockerにrockerChatをインストールし、チャットルームを設定するための詳細な手順

包括的なドキュメントgithubアドレスhttps://github.com/RocketChat/...

Linux システムの busybox に mkfs.vfat コマンドを移植する

オーディオおよびビデオ ファイルを保存するためのディスク寿命を延ばすには、ディスクをフォーマットする...

MySQLのスローログの開き方と保存形式の詳細な分析

開発プロジェクトでは、MySQL のスロークエリログを通じて効率の問題のある SQL を監視できます...

Ubuntu 14.04 に FTP サーバーをインストールするための実装手順

目次インストールソフトウェア管理匿名アクセスモード設定ファイルを変更するクライアントがサーバーにログ...

IDEA の Docker プラグインを介して SpringBoot プロジェクトをデプロイするプロセスの詳細な説明

1. Dockerリモート接続ポートを設定するサーバー上の docker.service ファイルを...

CSS のグリッドプロパティの使用に関する詳細な説明

グリッドレイアウト親要素に追加された属性グリッドテンプレートの列/グリッドテンプレートの行要素の行ま...

JavaScriptは双方向リンクリストプロセス分析を実装します

目次1. 二重連結リストとは何か2. 双方向リンクリストのカプセル化3. 双方向リンクリストの一般的...

Linux での wget コマンドの基本的な使い方

目次序文1. wgetを使用して単一のファイルをダウンロードする2. wget -Oを使用してダウン...

Vueフロントエンドパッケージングの詳細なプロセス

目次1. パッケージ化コマンドを追加する2. パッケージ化されたコードを実行する3. パッケージ化し...

MySQL で複数の主キーが定義されているエラーの解決方法

主キーを作成するには 2 つの方法があります。 テーブルテーブル名を作成( フィールド名タイプ、 フ...

Workermanはmysql接続プールのサンプルコードを書きます

まず、接続プールを使用する理由と、接続プールによってどのような問題が解決できるかを理解する必要があり...

Windows 10 での MySQL 5.7.19 インストール チュートリアル MySQL のルート パスワードを忘れた場合の変更方法

MySQL 5.7.19のインストールを例に挙げると、まずダウンロードしますもちろん、最初に行うこと...

Alibaba Cloud Serverにプログラムをデプロイし、ドメイン名を使用して直接アクセスする方法の詳細な説明

何もすることがなかったので、学習用に最も安いAlibaba Cloudサーバーを購入しました。年間3...

よく使われる HTML タグとその特徴の完全なリスト

まず、HTML タグのいくつかの特性を知っておく必要があります。 1. 「<keyword&g...