MySQLのnull値に関する小さな問題

MySQLのnull値に関する小さな問題

今日、null 値をテストしていたところ、小さな問題が見つかりました。ここに記録しました。以前にも遭遇したことがあるでしょうか。

何が起こっているのか、ご説明します。テーブル内の値をフィルタリングする場合、age=2 の列を削除してから、残りの列の情報を表示する必要があります。この操作は比較的簡単に思えます。テーブルを使用してプロセスをシミュレートします。

テーブル「test」を作成します(
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `age` int(11) デフォルト NULL,
  `score` varchar(20) NOT NULL DEFAULT '',
  主キー (`id`)、
  キー `idx_score` (`score`)
) エンジン=InnoDB AUTO_INCREMENT=12 デフォルト文字セット=utf8

テーブル構造は上記のとおりです。id フィールドと score フィールドは両方とも not null 制約の対象ですが、age フィールドはこの制約の対象ではありません。次のようにデータを挿入します。

mysql:yeyztest 23:32:57>>テストから*を選択します。
+----+------+-------+
| ID | 年齢 | スコア |
+----+------+-------+
| 1 | 1 | 5 |
| 2 | 2 | 10 |
| 5 | 5 | 25 |
| 8 | 8 | 40 |
| 9 | 2 | 45 |
| 10 | 5 | 50 |
| 11 | 8 | 55 |
+----+------+-------+
セット内の行数は 7 です (0.00 秒)

現在のデータ セットは完了しており、各フィールドには値があります。次に、次の SQL ステートメントを使用して、指定されたレコードを照会します。

ID が 0 のテストから * を選択します。 = 2;

結果を見てみましょう:

mysql:yeyztest 23:33:14>>age!=2 の場合、test から * を選択します。
+----+------+-------+
| ID | 年齢 | スコア |
+----+------+-------+
| 1 | 1 | 5 |
| 5 | 5 | 25 |
| 8 | 8 | 40 |
| 10 | 5 | 50 |
| 11 | 8 | 55 |
+----+------+-------+
セット内の行数は 5 です (0.00 秒)

この時点で、2 つのレコードを挿入します。

mysql:yeyztest 23:33:17>>テスト(id,score)値(12,60)に挿入します。
クエリは正常、1 行が影響を受けました (0.00 秒)

mysql:yeyztest 23:34:02>>テスト(id,score)値(13,65)に挿入します。
クエリは正常、1 行が影響を受けました (0.00 秒)

mysql:yeyztest 23:34:10>>テストから*を選択します。
+----+------+-------+
| ID | 年齢 | スコア |
+----+------+-------+
| 1 | 1 | 5 |
| 2 | 2 | 10 |
| 5 | 5 | 25 |
| 8 | 8 | 40 |
| 9 | 2 | 45 |
| 10 | 5 | 50 |
| 11 | 8 | 55 |
| 12 | NULL | 60 |
| 13 | NULL | 65 |
+----+------+-------+
セット内の行数は 9 です (0.00 秒)

上記のステートメントを使用して再度クエリを実行すると、次のような結果が表示されます。

mysql:yeyztest 23:34:15>>age!=2 の場合、test から * を選択します。
+----+------+-------+
| ID | 年齢 | スコア |
+----+------+-------+
| 1 | 1 | 5 |
| 5 | 5 | 25 |
| 8 | 8 | 40 |
| 10 | 5 | 50 |
| 11 | 8 | 55 |
+----+------+-------+
セット内の行数は 5 です (0.00 秒)

つまり、レコードに null 値が含まれている場合は、逆一致の age を使用します。 =2 では完全なクエリ結果を取得するには不十分であり、明らかに期待どおりではありません。

実は、この問題は前回の記事でも触れました。データ レコードでは、NULL 値フィールドと一般フィールドは一緒に保存されません。NULL 値フィールドは、NULL 値リストに保存されます。これにより、検索時に不一致が発生します。これは比較的重要なポイントであり、皆様のお役に立てば幸いです。

ちなみに、テスト環境は MySQL バージョン 5.7.16 です。

上記は、MySQL の null 値に関する小さな問題の詳細です。MySQL null 値の詳細については、123WORDPRESS.COM の他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • MySQL フィールドで NOT NULL を使用する必要があるのはなぜですか?
  • MySQLのよくある間違い
  • MySQL の null と not null、null と空の値の違いの詳細な説明''''''''
  • MySQL IFNULL判定問題の解決方法
  • MySQL で null 値と空文字 ('''') を区別する
  • mysql の not equal to null と equal to null の書き方の詳細説明
  • MySQL NULLがピットを引き起こした
  • MySQL の null (IFNULL、COALESCE、NULLIF) に関する知識ポイントのまとめ
  • MySQLの3値ロジックとNULLの詳細な説明

<<:  表のセルの内容が超過した場合に省略記号効果を表示する(実装コード)

>>:  JavaScript の構造化代入の一般的なシナリオと例 5 つ

ブログ    

推薦する

アイデアをDockerに接続してワンクリックでデプロイする方法

1. docker設定ファイルを変更し、ポート2375を開きます。 [root@s162 docke...

MySQL のインデックス障害の一般的なシナリオと回避方法

序文これまでにも、一部の SQL ステートメントを不適切に使用すると MySQL インデックスが失敗...

Tomcatはスレッドプールを使用してリモート同時リクエストを処理します。

Tomcatが同時リクエストを処理する方法を理解することで、スレッドプール、ロック、キュー、および...

Linuxのアラーム機能の例の説明

Linuxアラーム機能の紹介上記のコード: #include <stdio.h> #in...

MySQL 検査スクリプト (必読)

以下のように表示されます。 #!/usr/bin/env python3.5 psutilをインポー...

タブ効果を実現する js 開発プラグイン

この記事の例では、タブ効果を実現するためのjsプラグインの具体的なコードを参考までに共有しています。...

Linux システムで Java 環境変数を設定する方法

Java環境変数を設定するここで、環境変数は etc/profile に設定され、つまり、すべてのユ...

Mysql の読み取り/書き込み分離期限切れに対する一般的な解決策

MySQLの読み書き分離の落とし穴読み取りと書き込みの分離の主な目的は、メイン データベースの負荷を...

Linux での中国語入力方法の問題を素早く解決する

背景: 最近、資産報告関連の機能に取り組んでおり、中国語入力をサポートする必要があります。通常のショ...

Linux で JDK をインストールして環境変数を設定する方法 (この記事で十分です)

目次1. Linuxのビット数を確認する2. JDKをダウンロードする3. JDKをインストールする...

MySQLの読み書き分離により挿入後にデータが選択されなくなる問題を解決

MySQLは独立した書き込み分離を設定します。コードに次のものを書くと問題が発生する可能性があります...

Vue Nativeを使用したモバイルアプリケーションの構築プロセスの完全な記録

目次序文Vue Nativeの機能宣言的レンダリング双方向バインディングVue.js エコシステムの...

Linux で誤って削除したメッセージ ファイルを復元する方法

プロセスで使用されていて、誤って削除されたファイルがある場合、それらを回復することができます。プロセ...

Vue+ElementUI Treeの使い方

Vue+ElementUI Treeの使い方は参考までに。具体的な内容は以下のとおりです。 フロント...

フォームから Vue ElementUI を使用してログイン効果を実装する例

目次1. ElementUIで基本的なスタイルを構築する2. [送信]ボタンをクリックして、アカウン...