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で表示する方法

推薦する

JS は Web ページナビゲーションバーの特殊効果を実現します

この記事では、ネイティブ JS を使用して実装された実用的な Web ナビゲーション バー効果を紹介...

MySQL InnoDB トランザクション ロック ソースコード分析

目次1. ロックとラッチ2. 繰り返し読み取り3. インサートロックプロセス3.1 ロックモード3....

HTML要素のID属性とName属性の違い

今日、私は <a href="#13"></a> につい...

Linux コマンドにおける Ctrl+z、Ctrl+c、Ctrl+d の違いと使い方

Linux で Ctrl+c、Ctrl+d、Ctrl+z はどういう意味ですか? Ctrl+c と ...

Windows Server 2008 R2 に MySQL 5.7.10 をインストールする手順

MSIインストールパッケージを使用してインストールするご使用のオペレーティング システムに応じて、対...

vsFTP 3.0.3 のコンパイルとインストールの詳細な分析

脆弱性の詳細VSFTP は、GPL に基づいてリリースされた Unix ライクなシステムで使用される...

vue3 のコンポーネントの互換性のない変更の詳細な説明

目次機能コンポーネント非同期コンポーネントの書き方とdefineAsyncComponentメソッド...

Linux システムでのスケジュールされたタスクの紹介

目次1. 計画タスクをカスタマイズする2. 時間を同期する3. 練習する4. セキュリティの問題1....

Linux 環境の Apache で https サービスを有効にする方法の詳細な説明

この記事では、Linux 環境の Apache で https サービスを有効にする方法について説明...

製品の拡大鏡効果を実現する JavaScript

この記事では、参考までに、製品拡大鏡を実装するためのJavaScriptの具体的なコードを紹介します...

Vue3.0 で Vuex 状態管理を開始する方法をすぐに習得します

Vuex は、Vue.js アプリケーション専用に開発された状態管理パターンです。集中型ストレージを...

トランザクション分離レベルのMySQLケース分析

目次1. 理論シリアル化可能繰り返し読み取りコミットされた読み取りコミットされていない読み取り2. ...

Web インタビュー Vue カスタム コンポーネントと呼び出しメソッド

輸入:プロジェクトの要件により、同じコードの一部をコンポーネントにカプセル化し、必要な場所にインポー...

JavaScript をスリープまたは待機させる方法

目次概要setTimeout() の確認スリープ関数の書き方シンプルな選択ループで実行されますか?要...

MySQL クエリのパケットが大きすぎる問題と解決策

問題の説明:エラーメッセージ:原因: com.mysql.jdbc.PacketTooBigExce...