MySQLは一意制約のnull値を無視しますか?


回答:


422

はい。MySQLでは、一意の制約を持つ列で複数のNULLを使用できます。

CREATE TABLE table1 (x INT NULL UNIQUE);
INSERT table1 VALUES (1);
INSERT table1 VALUES (1);   -- Duplicate entry '1' for key 'x'
INSERT table1 VALUES (NULL);
INSERT table1 VALUES (NULL);
SELECT * FROM table1;

結果:

x
NULL
NULL
1

これはすべてのデータベースに当てはまるわけではありません。たとえば、SQL Server 2005以前では、一意の制約を持つ列で単一のNULL値のみが許可されています。


37
mysqlでそれがどのように真実であるかについての優れたコメントですが、必ずしも一般的ではありません。
user2910265 14

11
SQLite FAQによると、動作 MySQL、PostgreSQL、SQLite、Oracle、Firebirdで同じです。
Amir Ali Akbari

4
回答を更新してください。SQLServerのは2008+絶対にそれを可能にし、あなたは、単に2017年に... WHERE句を追加する必要があり、誰もがとにかく2008よりも古いバージョンであってはならない... stackoverflow.com/questions/767657/...
マチューターコット

この小さな機能は、データベースへの新しい列の追加や非常に古いアプリケーションでのMySQLのアップグレードを必要としない答えを見つけるのが非常に困難でした。私は本当にCOALESCEを使用できるPostgresのようなソリューションを探していましたが、答えは常にバグではなく、それがどのように設計されているかということです。WHERE column IS NOT NULL私のバージョンのMySQLではサポートされていないため、失敗するようにも見えません。誰もが私がどこを見られるか知っていますか?
newdark-it

1
注:これは、より多くの列を持つ一意のインデックスでも機能します。したがって、列a、b、cを一意にしたい場合でも、null、b、cを含むテーブルの二重行を使用できます
Mihai Crăiță

111

ドキュメントから:

「UNIQUEインデックスは、NULLを含むことができる列に対して複数のNULL値を許可します」

これは、BDBを除くすべてのエンジンに適用されます。


3
BDBは現在のmysqlバージョン(5.1.12以降)では利用できなくなりました。
AlimÖzdemir15年

1
私のテストは、Java Derbyデータベースv10.13.1.1であることを示しているようです。同様に、一意のインデックスを持つ列にnullを1つだけ許可します。
chrisinmtown 2018年

7

著者がもともとこれが重複値を許可するかどうかを尋ねていたのか、またはここで「NULL使用中に重複値を許可するにはどうすればよいUNIQUEですか?」または「1つのUNIQUE NULL値のみを許可する方法」

質問はすでに回答されています。はいNULLUNIQUEインデックスを使用しているときに値が重複する可能性があります。

「1つのUNIQUE NULL値を許可する方法」を検索しているときに、この答えを見つけました。同じことをしながらこの質問に遭遇する可能性のある他の誰にとっても、私の答えの残りはあなたのためです...

MySQL UNIQUE NULLでは1つの値を持つことはできませんがUNIQUE、空の文字列の値を挿入することにより、1つの空の値を持つことができます。

警告:文字列以外の数値と型は、デフォルトで0または別のデフォルト値になる場合があります。


1
制約はインデックスとは関係ありません。実際、そのような行が他にないにもかかわらず、NULL値を持つ単一の行を持つことはできません。
Pijusn 2017年

1
@Pijusn「制約はインデックスとは関係がない」とはどういう意味ですか?また、2番目の文については、NULL値を含む行があるとは言わなかったので、投稿の冒頭で述べましたが、これは、彼がnull値を使用するように設定されていない場合にのみ解決策であると述べました。
bluegman991 2017年

つまり、新しい要素の追加は、UNIQUE制約のためではなく、制約のために失敗するということですNOT NULL。質問は特にUNIQUE拘束の振る舞いに関するものであるため、この回答は質問には無関係であると思います。
Pijusn 2017年

@Pijusnわかった。そうです、私はそうでないことを示唆する文言を削除しました。質問を読み間違えました。しかし、一意の「何もない」値を持つ方法を見つけようとしたときにこの質問に出くわしたが、誤ってnull機能を許可しているユーザーにとって、答えは依然として役立つかもしれません。
bluegman991 2017年

1
この回答は役に立ちました。ただし、ここでも回答されています。この投稿は私のGoogle検索の最初の結果でしたが、この回答とリンクされた質問が私が探していたものでした。
kingledion 2017

5

null可能な一意制約は避けてください。いつでも列を新しいテーブルに配置し、それを非nullかつ一意にして、値がある場合にのみそのテーブルにデータを設定できます。これにより、列に対するキーの依存関係が正しく適用され、nullによって引き起こされる可能性のある問題が回避されます。


6
はい。しかし、あなたが提案することは、mysqlがすでに裏で行っていることとほぼ同じです。この機能が組み込まれているのに、なぜホイールを再発明するのですか?
ProfileTwist 14年

2
有効なSQLではないからです。このヒントは、データベースにとらわれない設計が必要(または必要)なすべての人に役立つと思います。
Arsen7 2014

@ Arsen7複数のクライアントがいる複数のビジネスがある場合はどうでしょうか。すべてのビジネスをクライアントのメールアドレスとともに1つのファイルに保存します。したがって、異なるビジネスが同じクライアントを持っている可能性があるため、email_addressを一意にすることはできません。したがって、business_idとemail_addressの複合一意インデックスを作成する必要があります。説明したように、これを新しいテーブルに入れることは可能ですか?
Gerhard Liebenberg、2015

4
「email」列が一意またはnullである必要がある場合があります。私があなたのアドバイスに従うなら、私は単一の「email」列を持つ新しいテーブルを作成しなければなりません。このMysql固有の動作に依存する方がはるかに簡単で、結果は同じです。お客様がメールを新しいテーブルに保存するかどうかは気にしません。また、データベースにとらわれない設計は、しばしば過大評価されます。多くのプロジェクトでは、1つのDBから別のDBに簡単に切り替えることはできません。
conradkleinespel

1
@djmjもちろんですが、機能的な依存関係はほとんどの人にとって重要であり、nullableな一意制約バージョンはBCNFバージョンと同じ依存関係を強制しません。したがって、どちらのオプションが多かれ少なかれ実用的であるかは、どの依存関係があなたにとって重要であるかに依存する場合があります。そのため、新しいテーブルの作成を検討する価値があります。
nvogel
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.