Czy MySQL ignoruje wartości null na unikalnych ograniczeniach?

Mam kolumnę e-mail, że chcę być unikalny. Ale chcę również, aby akceptowała wartości null. Czy moja baza danych może mieć 2 zerowe e-maile w ten sposób?

Author: Slava Rozhnev, 2010-09-14

5 answers

Tak, MySQL pozwala na wiele Null w kolumnie z unikalnym ograniczeniem.

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;

Wynik:

x
NULL
NULL
1

Nie dotyczy to wszystkich baz danych. SQL Server 2005 i starsze, na przykład, zezwala tylko na jedną wartość NULL w kolumnie, która ma unikalne ograniczenie.

 470
Author: Mark Byers,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-10-08 13:50:18

From The docs :

"unikalny indeks pozwala na wielokrotne NULL wartości dla kolumn, które mogą zawierać NULL "

Dotyczy to wszystkich silników oprócz BDB .

 119
Author: Matthew Flaschen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-14 19:33:36

Nie jestem pewien, czy autor pierwotnie zadawał tylko pytanie, Czy pozwala to na powielanie wartości, czy też nie było dorozumiane pytanie, " jak zezwolić na powielanie wartości NULL podczas korzystania z UNIQUE?"Lub" jak zezwolić tylko na jeden UNIQUE NULL wartość?"

Pytanie zostało już udzielone, tak, możesz mieć duplikaty NULL wartości podczas korzystania z indeksu UNIQUE.

Ponieważ natknąłem się na tę odpowiedź podczas poszukiwania "jak pozwolić na UNIQUE NULL wartość."Dla każdego jeśli ktoś może natknąć się na to pytanie, robiąc to samo, reszta mojej odpowiedzi jest dla Ciebie...

W MySQL nie możesz mieć UNIQUE NULL wartość, jednak możesz mieć jedną UNIQUE pustą wartość przez wstawienie z wartością pustego łańcucha.

Warning: Numeric and types other than string may default to 0 or another default value.

 9
Author: bluegman991,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-15 21:24:55

Unikaj nullable unikalnych ograniczeń. Zawsze możesz umieścić kolumnę w nowej tabeli, uczynić ją nie-null i unikalną, a następnie wypełnić tę tabelę tylko wtedy, gdy masz dla niej wartość. Zapewnia to, że każda kluczowa zależność od kolumny może być poprawnie wymuszona i pozwala uniknąć problemów, które mogą być spowodowane przez null.

 7
Author: nvogel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-14 19:46:36

Prosta odpowiedź brzmiałaby: No, it doesn't

Explanation: According to the definition of unique constraints (SQL-92)

Unikalne ograniczenie jest spełnione wtedy i tylko wtedy, gdy żadne dwa wiersze w tabeli nie mają takich samych wartości innych niż null w unikalnych kolumnach

Stwierdzenie to może mieć dwie interpretacje jako:

  • żadne dwa wiersze nie mogą mieć takich samych wartości, tzn. NULL i NULL nie są dozwolone
  • żadne dwa wiersze nieujemne nie mogą mieć wartości tzn. NULL i NULL jest w porządku, ale StackOverflow i StackOverflow nie wolno

Ponieważ MySQL podąża za drugą interpretacją, wiele wartości NULL jest dozwolonych w kolumnie UNIQUE constraint. Po drugie, jeśli spróbujesz zrozumieć pojęcie NULL w SQL, przekonasz się, że dwie wartości NULL mogą być w ogóle porównywane, ponieważ NULL w SQL odnosi się do niedostępnej lub niepodpisanej wartości (nie możesz porównać nic z niczym). Teraz, jeśli nie zezwalasz na wiele wartości NULL w kolumnie UNIQUE constraint, podpisujesz umowę Znaczenie NULL w SQL. Podsumowując swoją odpowiedź:

MySQL obsługuje unikalne ograniczenia, ale nie na koszt ignorowania NULL wartości

 0
Author: Akshay Katiha,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-11-07 19:28:50