Вы пометили вопрос как sqlite и mysql, поэтому я рассмотрю оба.
SQLite
В SQLite, a УНИКАЛЬНОЕ ограничение будет работать так, как вы хотите.
Документация для УНИКАЛЬНОЕ ограничение гласит:
Для целей УНИКАЛЬНЫХ ограничений учитываются значения NULL. отличается от всех других значений, включая другие NULL .
Документация для CREATE INDEX гласит:
Если ключевое слово UNIQUE появляется между CREATE и INDEX, тогда повторяющиеся записи индекса не допускаются. Любая попытка вставить повторяющуюся запись приведет к ошибке. Для целей уникальных индексов все значения NULL считаются отличными от всех других значений NULL и поэтому являются уникальными. Это одна из двух возможных интерпретаций стандарта SQL -92 (язык в стандарте неоднозначен) и является интерпретацией, за которой следуют PostgreSQL, MySQL, Firebird и Oracle. Informix и Microsoft SQL Server следуют другой интерпретации стандарта.
Однако в большинстве других баз данных столбцы ограничения UNIQUE не могут быть равны NULL, поэтому я рекомендую использовать вместо них UNIQUE INDEX , для согласованности и чтобы не вводить людей в заблуждение.
MySQL
В MySQL уникальное ограничение будет работать так, как вы хотите.
Документация для Уникальные индексы говорит:
A UNIQUE
index разрешает множественные NULL
значения для столбцов, которые могут содержать NULL
.
УНИКАЛЬНЫЙ КЛЮЧ является синонимом УНИКАЛЬНОГО ИНДЕКСА.
SQL Сервер
Как упоминалось в документации по SQLite, Microsoft SQL Сервер придерживается иной интерпретации обработки NULL. для уникальных индексов.
Документация для UNIQUE INDEX гласит:
Столбцы, которые используются в уникальном индексе, должны быть установлены в NOT NULL, потому что множественные нулевые значения считаются du применяется при создании уникального индекса.
Чтобы обойти это, используйте отфильтрованный индекс, например,
CREATE UNIQUE INDEX Person_Email
ON Person ( Email )
WHERE Email IS NOT NULL;