У меня есть столбец электронной почты, который я хочу сделать уникальным. Но я также хочу, чтобы он принимал нулевые значения. Может ли моя база данных таким образом иметь 2 пустых письма?
MySQL игнорирует нулевые значения в уникальных ограничениях?
Ответы (5)
Да, 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 в столбце с уникальным ограничением.
WHERE column IS NOT NULL
, похоже, не подводит меня, поскольку он не поддерживается в моей версии MySQL. Кто-нибудь знает, где я могу посмотреть?
- person newdark-it; 20.11.2018
Из документов:
"индекс UNIQUE допускает несколько значений NULL для столбцов, которые могут содержать NULL"
Это относится ко всем движкам, кроме BDB.
Я не уверен, что автор изначально просто спрашивал, допускает ли это дублирование значений, или здесь подразумевается вопрос: «Как разрешить дублирование значений NULL
при использовании UNIQUE
?» Или "Как разрешить только одно UNIQUE
NULL
значение?"
На этот вопрос уже был дан ответ, да, при использовании индекса UNIQUE
у вас могут быть повторяющиеся значения NULL
.
Поскольку я наткнулся на этот ответ, когда искал «как разрешить одно значение UNIQUE
NULL
». Для всех, кто может наткнуться на этот вопрос, делая то же самое, остальная часть моего ответа предназначена для вас ...
В MySQL у вас не может быть одного UNIQUE
NULL
значения, однако вы можете иметь одно UNIQUE
пустое значение, вставив его со значением пустой строки.
Предупреждение: числовые и другие типы, кроме строки, могут по умолчанию равняться 0 или другому значению по умолчанию.
UNIQUE
, а из-за ограничения NOT NULL
. Я думаю, что этот ответ не имеет отношения к вопросу, потому что вопрос конкретно касается поведения ограничения UNIQUE
.
- person Pijusn; 15.01.2017
IFNULL(field_name, '')
и создать для него индекс.
- person toraman; 21.05.2021
Избегайте ограничений уникальности, допускающих значение NULL. Вы всегда можете поместить столбец в новую таблицу, сделать его непустым и уникальным, а затем заполнить эту таблицу только тогда, когда у вас есть для нее значение. Это гарантирует, что любая зависимость ключа от столбца может быть правильно применена, и позволяет избежать любых проблем, которые могут быть вызваны значениями NULL.
WHERE column IS NOT NULL
. В некоторых таблицах у вас даже есть несколько ограничений, допускающих значение NULL. Наличие таблицы для каждого ограничения выглядит очень накладно.
- person djmj; 31.05.2020
Простой ответ: No, it doesn't
Объяснение: Согласно определению уникальных ограничений (SQL-92)
Ограничение уникальности выполняется тогда и только тогда, когда никакие две строки в таблице не имеют одинаковых ненулевых значений в уникальных столбцах.
Это утверждение может иметь две интерпретации:
- Никакие две строки не могут иметь одинаковые значения, т.е.
NULL
иNULL
недопустимы. - Никакие две ненулевые строки не могут иметь значений, т.е.
NULL
иNULL
в порядке, ноStackOverflow
иStackOverflow
не допускаются.
Поскольку MySQL следует второй интерпретации, в столбце ограничения UNIQUE
допускается несколько значений NULL
. Во-вторых, если вы попытаетесь понять концепцию NULL
в SQL, вы обнаружите, что два NULL
значения вообще нельзя сравнивать, поскольку NULL
в SQL относится к недоступному или неназначенному значению (вы не можете ничего сравнивать ни с чем). Теперь, если вы не разрешаете использовать несколько значений NULL
в столбце ограничений UNIQUE
, вы сокращаете значение NULL
в SQL. Я бы резюмировал свой ответ, сказав:
MySQL поддерживает ограничение UNIQUE, но не за счет игнорирования значений NULL