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?
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.
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 .
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.
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.
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
iNULL
nie są dozwolone - żadne dwa wiersze nieujemne nie mogą mieć wartości tzn.
NULL
iNULL
jest w porządku, aleStackOverflow
iStackOverflow
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
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