MySQL におけるユニーク制約と NULL の詳細な説明

MySQL におけるユニーク制約と NULL の詳細な説明

序文

説明を簡略化するために以前に設定した要件は、他のグループから MQ メッセージを受信し、データベースにレコードを挿入することです。メッセージが繰り返し送信されたり、重複レコードが複数挿入されたりするのを防ぐために、テーブル内のいくつかの列に一意のインデックスが追加されます。

testTable (A、B、C) に一意のインデックス IDX_UN_LOAN_PLAN_APP を作成します。

この時点では、列 A、B、C では NULL 値は許可されておらず、一意性制約も機能します。

その後、要件の変更により、以前の一意性制約が変更され、さらに 1 つの列が追加されました。 (追加された理由については詳しく説明しません)。

ALTER TABLE テストテーブル
インデックスIDX_UN_LOAN_PLAN_APPを削除します。
一意のキー「IDX_UN_LOAN_PLAN_APP」(A、B、C、D) を追加します。

新しく追加された D は datetime 型で、NULL を許可し、デフォルト値は NULL です。デフォルト値が NULL になっているのは、すべてのレコードにこの時刻があるわけではないからです。マジック値 (「1970-01-01 08:00:00」など) を強制的にデフォルト値に設定すると、見た目がおかしくなります。

青の女王。 。 。その時、物事はうまくいかなくなるのです。 D を追加すると、一意性制約は基本的に無効になります。

testTable (A,B,C,D) に VALUES (1,2,3,NULL) を挿入します。 --- OK
testTable (A,B,C,D) に VALUES (1,2,3,NULL) を挿入します。 --- OK
testTable (A,B,C,D) に VALUES (1,2,3,NULL) を挿入します。 --- OK

上記の 3 つの SQL ステートメントはすべて正常に実行され、データベースには複数の同一レコードが存在します。以前のアイデアによれば、最後の 2 つの SQL ステートメントを実行するときに、「重複キー」例外がスローされるはずです。

後で調べたところ、MySQL の公式ドキュメントにすでにこの点が明記されていました。ユニーク インデックスでは複数の NULL 値が存在することが可能です。

UNIQUE インデックスは、インデックス内のすべての値が一意でなければならないという制約を作成します。既存の行と一致するキー値を持つ新しい行を追加しようとすると、エラーが発生します。すべてのエンジンで、UNIQUE インデックスは、NULL を含めることができる列に対して複数の NULL 値を許可します。

下の表から、どのタイプのストレージ エンジンが使用されているかに関係なく、一意のキーを作成するときに複数の NULL が許可されていることもわかります。 。 。 。

よく考えてみると、これは実はかなり合理的です。結局のところ、MySQL では NULL は「不明」を表します。 SQL では、NULL と比較される値は TRUE ではなく NULL を返し、NULL と NULL の比較でも NULL が返されます。

したがって、唯一の解決策はそれを修正することです。 。 。解決策は非常に単純で大雑把です。オンライン データを更新し、デフォルト値として「1970-01-01 08:00:00」を設定し、列を NULL を許可しないように変更しただけです。

MySQL の公式 Web サイトで多くの人がこの問題について議論しています。これは MySQL のバグだと考える人もいれば、機能だと考える人もいます。リンクを添付します。

MySQL バグ: #8173: 一意のインデックスで null 値の重複が許容される

要約する

上記はこの記事の全内容です。この記事の内容が皆さんの勉強や仕事に少しでもお役に立てれば幸いです。ご質問があれば、メッセージを残してコミュニケーションしてください。123WORDPRESS.COM をご愛顧いただき、ありがとうございます。

以下もご興味があるかもしれません:
  • mysql の not equal to null と equal to null の書き方の詳細説明
  • MySQL NULLがピットを引き起こした
  • MySQL でテーブルを作成するときの NULL と NOT NULL の使用方法の詳細な説明
  • MySQL の null (IFNULL、COALESCE、NULLIF) に関する知識ポイントのまとめ
  • MySQL の NOT IN 充填ピットの NULL 列の問題の解決方法
  • MySQL 文字列連結と null 値の設定のためのインスタンス メソッド
  • MySQL のインデックスにおける NULL の影響についての詳細な説明
  • MySQL の null 可能フィールドは NULL に設定する必要がありますか、それとも NOT NULL に設定する必要がありますか?
  • MySQL で null を置き換える IFNULL() および COALESCE() 関数の詳細な説明
  • MySQL NULLデータ変換方法(必読)
  • MySQL で null 値と空文字 ('''') を区別する

<<:  jQuery ベースのカレンダー効果

>>:  Dockerイメージの作成、保存、読み込み方法

推薦する

MySQLのロック機構に関する最も包括的な説明

目次序文グローバルロック完全なデータベース論理バックアップFTWRL と set global re...

MySQL 8.0.13 解凍版のインストールと設定方法のグラフィックチュートリアル

1. インストール1. MySQLをダウンロードするダウンロードアドレス: リンクアドレスブラウザで...

Linux システムのシャットダウンコマンドの違いと使い方の詳細な説明

Linux システムのシャットダウン コマンドは何ですか? Liangxu Tutorial Net...

hrefを使用すると、リンクをクリックするだけでページ上の特定の場所にジャンプできます。

ページ内の a タグをクリックした後、ページ内の対応する場所にジャンプするようにします。方法は非常に...

Nginx 外部ネットワーク アクセス イントラネット サイト構成操作

背景:サイトはフロントエンドとバックエンドから分離されています: vue+springbootフロン...

MySQL 5.7 インストール不要の設定グラフィックチュートリアル

Mysql は人気があり、使いやすいデータベース ソフトウェアです。以下は、mysql の無料インス...

Ubuntu Server でのワイヤレス ネットワーク カードの詳細な設定

1. ワイヤレス ネットワーク カードを挿入し、コマンドiwconfigを使用してワイヤレス ネット...

Alibaba Cloud Ubuntu 16.04 が IPSec サービスを構築

IPSec の概要IPSec (インターネット プロトコル セキュリティ): ネットワーク層と適用さ...

JavaScript で H5 ゴールド コイン関数を実装する (サンプル コード)

今日は春節の金貨の赤い封筒のアクティビティを作りました。なかなか良い出来だと思います。皆さんと共有し...

選択ドロップダウンボックスの値をIDに渡してコードを実装する方法

完全なコードは次のとおりです。 HTMLコード:コードをコピーコードは次のとおりです。 <!-...

Windows 10 64 ビット版に MySQL 5.6.35 をインストールするためのグラフィック チュートリアル

1. MySQL Community Server 5.6.35をダウンロードするダウンロードアドレ...

Nginx のステータス監視とログ分析の詳細な説明

1. Nginx ステータス監視Nginx には、Nginx の全体的なアクセス ステータスを監視す...

CentOS7 に YUM 経由で MySQL 5.7 をインストールする詳細な手順

1. インストールパッケージを保存する場所に移動しますcd /home/lnmp 2. MySQL ...

美容・スタイリングウェブサイト向けのカラーマッチングテクニックと効果表示

色はあらゆるウェブサイトにとって最も重要な要素の 1 つであり、閲覧者に大きな影響を与えるため、色の...

MySQL IDは1から増加し始め、不連続IDの問題を素早く解決します

mysql idは1から始まり、不連続なidの問題を解決するために自動的に増加します。強迫性障害の私...