MySQLのUPDATE文の落とし穴を記録する

MySQLのUPDATE文の落とし穴を記録する

背景

最近、オンライン操作中に DML ステートメントを実行しました。これは絶対確実だと思っていましたが、アプリケーションは更新されず、データは変更されていないと報告しました。調査の結果、ステートメントを誤って記述したため、更新ステートメントの結果が期待と一致しないことが判明しました。

再現

デモンストレーションの便宜上、ユーザー テーブルを作成し、5 つのレコードを同時に挿入します。

テーブルユーザーを作成(
id int(12) コメント 'ユーザー主キーID',
name varchar(36) コメント 'ユーザー名',
年齢 int(12) コメント '年齢');

ユーザー値に (1,'one',11),(2,'two',12),(3,'three',13),(4,'four',15),(5,'five',15) を挿入します。

実行が完了すると、ユーザー テーブルのデータは次のようになります。

+------+-------+------+
| ID | 名前 | 年齢 |
+------+-------+------+
| 1 | 一つ | 11 |
| 2 | 2 | 12 |
| 3 | 3 | 13 |
| 4 | 4 | 15 |
| 5 | 五 | 15 |
+------+-------+------+

ここで、すべての年齢を 10 に、ユーザー名を user に変更する必要があります (この操作が意味をなすと仮定)。運用と保守に送信する DML ステートメントは次のようになります。

ユーザーを更新し、age=10 および name='user' を設定します。

ユーザー テーブルを更新すると、更新ステートメントを実行した後のテーブル内のすべてのデータが次のようになっていることがわかります。

+------+-------+------+
| ID | 名前 | 年齢 |
+------+-------+------+
| 1 | 一つ | 0 |
| 2 | 2 | 0 |
| 3 | 3 | 0 |
| 4 | 四 | 0 |
| 5 | 五 | 0 |
+------+-------+------+

不思議なことが起こりました。年齢フィールドはすべて 0 に更新されましたが、名前フィールドはまったく変更されていませんでした。

原因と修正

エラーの原因は実は非常に単純で、更新ステートメントが正しく記述されていないことです。 MySQLのupdate文の構文は

テーブル名の更新
SET 列1=値1、列2=値2、...
ここで、some_column=some_value;
```sql

複数のフィールドを更新する場合、隣接するフィールドは `and` ではなくコンマで区切る必要があります。更新文が複数のフィールド間の区切りとして「and」を使用する場合、最初に運用保守に提出したように、この更新文は最終的に「```sql
ユーザーを更新し、age=(10、name='user') を設定します。

ブール値の戻り値を持つ判断ステートメントとして、(10 and name='user') は 1 または 0 にマッピングされます。最初に更新された変数が誤ったデータに更新される可能性は 99.999% です。

正しい更新ステートメントは次のようになります

ユーザーを更新し、age=10、name='user' を設定します。

レッスン

DML ステートメントを送信する前に、テスト環境で基本的な SQL 構文を試して、正しく覚えていることを確認してください。

まとめ

MySQLのupdate文の構文は

テーブル名の更新
SET 列1=値1、列2=値2、...
ここで、some_column=some_value;

以上がMySQLのupdate文を使用する際の落とし穴の詳細です。MySQLのupdate文の詳細については、123WORDPRESS.COMの他の関連記事もご覧ください。

以下もご興味があるかもしれません:
  • Mysql クロステーブル更新マルチテーブル更新 SQL ステートメントの概要
  • MySQL ログを通じて実行ステートメントと更新ログをリアルタイムで表示するチュートリアル
  • SQL UPDATE 更新ステートメントの使用法 (単一列と複数列)
  • 更新SQL文に基づくMySQLロックの理解
  • JavaリフレクションJavaBeanオブジェクトは、挿入、更新、削除、クエリSQLステートメント操作を自動的に生成します。
  • SQL 更新ステートメントでの使用からの更新セットの実装
  • SQL更新文の実行プロセスの分析

<<:  HTML DOM入門_PowerNode Javaアカデミー

>>:  JSONデータをHTMLで表示する方法

推薦する

HTML メタビューポート属性の説明

ビューポートとはモバイル ブラウザは、Web ページを仮想の「ウィンドウ」(ビューポート) に配置し...

Linux は、Deepin がルートユーザーとして Google Chrome ブラウザを起動できない問題を解決します

Deepin がルートユーザーとして Google Chrome ブラウザを起動できない問題を解決す...

JS での Reduce() メソッドの使用の概要

目次1. 文法2. 例3. その他の関連方法長い間、reduce() メソッドの具体的な使い方を理解...

JavaScript のアンチシェイクとスロットリングの違いと実装

目次1. 手ぶれ補正2. スロットリング3. まとめ序文:フロントエンド開発者には、次の 2 つの要...

Vueで背景色と透明度を設定する方法

背景色と透明度の設定上記のように、最初の画像の場合は、灰色の背景と左上隅に白い「カバー」という文字を...

MySQL インデックス プッシュダウンを 5 分で理解する

目次インデックス プッシュダウンとは何ですか?インデックスプッシュダウン最適化の原理インデックスプッ...

便利なモバイルスクロールプラグイン BetterScroll

目次スクロールをスムーズにするBetterScrollのスクロール体験慣性ローリングエッジリバウンド...

VueでEchartsチャートの幅と高さの適応を実現する実践

目次1. インストールとインポート2. 手ぶれ補正機能を定義する3. チャートコードを描くinit ...

EChartsマルチチャート連携機能の実装プロセス

表示するデータが多い場合、1 つのチャートに表示しても効果はよくありません。このとき、2 つのチャー...

Web デザイン リファレンス Firefox デフォルト スタイル

W3C は HTML の標準をいくつか確立していますが、ブラウザは独自の定義済みスタイルに従って W...

Vue のフィルターの適用シナリオの詳細な説明

filterは通常、特定の値をフィルターするために使用されます。たとえば、フィールドが空だが、フロン...

Dockerイメージをインポートおよびエクスポートする方法

この記事では、移行、バックアップ、アップグレードなどのシナリオで使用される Docker イメージの...

MySQL 8.0の新機能、隠しフィールドの詳細な説明

序文MySQL バージョン 8.0.23 では、新しい機能「Invisible Column (In...

XML構文の詳細な説明

1. 文書化ルール1. 大文字と小文字が区別されます。 2. 属性値は引用符(一重引用符または二重引...