ホームページ  >  記事  >  データベース  >  MySQLの一意制約とNULLインスタンスの詳細な説明

MySQLの一意制約とNULLインスタンスの詳細な説明

小云云
小云云オリジナル
2018-01-13 14:10:521682ブラウズ

この記事では、MySQL における一意制約と NULL に関する関連情報を主に紹介します。この記事の紹介は非常に詳細であり、必要な方は以下を参照してください。皆さんのお役に立てれば幸いです。

前書き

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

CREATE UNIQUE INDEX IDX_UN_LOAN_PLAN_APP ON testTable (A, B, C);

この時点で、A、B、C の 3 つの列は NULL 値を許可せず、一意性制約も機能します。

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

ALTER TABLE testTable
DROP INDEX IDX_UN_LOAN_PLAN_APP,
ADD UNIQUE KEY `IDX_UN_LOAN_PLAN_APP` (A, B, C, D);

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

青い女王。 。 。何か問題が発生しました。 D を追加すると、一意性制約は基本的に無効になります。

Insert into testTable (A,B,C,D) VALUES (1,2,3,NULL); --- OK
Insert into testTable (A,B,C,D) VALUES (1,2,3,NULL); --- OK
Insert into testTable (A,B,C,D) VALUES (1,2,3,NULL); --- OK

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

後で確認したところ、MySQL の公式ドキュメントには、これが明確に記載されていることがわかりました。一意のインデックスでは、複数の NULL 値の存在が許可されます。

A UNIQUE index creates a constraint such that all values in the index must be distinct. An error occurs if you try to add a new row with a key value that matches an existing row. For all engines, a UNIQUE index allows multiple NULL values for columns that can contain NULL.

どのような型が使用されても、以下の表からもわかります。ストレージ エンジンでは、一意のキーを作成するときに複数の NULL が存在することが許可されます。 。 。 。

よく考えてみると、結局のところ、MySQL では NULL が「不明」を表すと考えられています。 SQL では、任意の値と NULL を比較すると、TRUE ではなく NULL が返されます。NULL と NULL を比較した場合でも、NULL が返されます。

だから私たちはそれを修正するしかありません。 。 。解決策は非常にシンプルかつ大雑把です。オンライン データを更新し、「1970-01-01 08:00:00」をデフォルト値として設定し、その列を NULL を許可しないように変更します。

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

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

関連する推奨事項:

PHP の型制約

MySQL の制約、複数テーブル クエリ、およびサブクエリの詳細な例

php

の型制約のコードアイデア

以上がMySQLの一意制約とNULLインスタンスの詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。