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 で Portainer ビジュアル インターフェースを構築するための詳細な手順

前回述べた問題を解決するために、オンラインで検索したところ、非常に優れたビジュアル インターフェース...

プロジェクトに必須の 8 つの JavaScript コード スニペット

目次1. ファイル拡張子を取得する2. コンテンツをクリップボードにコピーする3. スリープ時間は何...

MySQL の null 可能フィールドは NULL に設定する必要がありますか、それとも NOT NULL に設定する必要がありますか?

MySQL を頻繁に使用する人は、次のような状況に遭遇する可能性があります。 1. フィールド タ...

win10 mysql 5.6.35 winx64 無料インストールバージョン設定チュートリアル

mysql 5.6.35 winx64無料インストールバージョン構成チュートリアルwin10、具体的...

Nginxは特定のページへのIPアクセスを制限します

1.すべてのIPアドレスが3つのページa1.htm、a2.htm、a3.htmにアクセスするのを禁止...

Linux のタイムドログ削除を実装する簡単な方法

導入Linux は、ファイル、ログ、電子メール、バックアップなどを自動的に生成できるシステムです。ハ...

nginx と keepalived を組み合わせて高可用性を実現するための手順を完了する

序文システムの高可用性を満たすためには、通常、クラスターを構築する必要があります。ホストがクラッシュ...

HTMLテキストオーバーフローの2つの一般的な解決策は省略記号を表示することです

方法1: CSSオーバーフロー省略を使用して解決する解決策は次のとおりです。 CSSコード: ディス...

Centos7 に DAMO データベースをインストールするチュートリアル

1. 準備Linux オペレーティング システムをインストールした後、ここで Linux 7 を選択...

MySQLでビューを作成する方法

基本的な構文CREATE VIEW ステートメントを使用してビューを作成できます。構文の形式は次のと...

MySQL テーブルスペースの断片化の概念と関連する問題の解決策

目次背景表領域の断片化とは何ですか?表領域の断片化を確認する方法表スペースの断片化問題を解決する方法...

適応的な幅と高さを持つ9つの正方形グリッドの背景画像の切り取りの分析

<br />幅と高さが適応するオリジナルの 9 グリッド レイアウトをベースに、ネットワ...

MySQLテーブル内の重複データをクエリする方法

hk_test(ユーザー名、パスワード) に値を挿入 ('qmf1', '...

TypeScriptはvscodeを使用してコードのコンパイルプロセスを監視します

インストールtsコマンドをグローバルにインストールする npm install -g typescr...

JavaScript を使用してセカンダリ メニューを作成する

この記事では、セカンダリメニュー効果を実現するためのJavaScriptの具体的なコードを参考までに...