Несколько уникальных в MySQL не поддерживает NULL - PullRequest
4 голосов
/ 28 июля 2011
ALTER TABLE admins ADD CONSTRAINT uc_EmailandDeleted_at UNIQUE (email,deleted_at);

Я изменил свою таблицу, чтобы она работала так:

ID  EMAIL                  DELETED_AT  
1.  user@example.com          NULL             <- accept  
2.  user@example.com          NULL             <- reject because of uniqueness.

Но она не работает, как я хочу.Если бы я дал две идентичные даты

deleted_at
, то это выдает ошибку, как я и ожидал.Но не для значений NULL.Любая идея?

NB: я не могу изменить поведение столбца deleted_at, потому что я использую act_as_paranoid.Поэтому я должен оставить поле deleted_at равным NULL или любой дате.

1 Ответ

5 голосов
/ 28 июля 2011

С документация :

УНИКАЛЬНЫЙ индекс создает ограничение, так что все значения в индексе должен быть отличным. При попытке добавить новую строку с значение ключа, которое соответствует существующей строке. Это ограничение не применяется к значениям NULL, за исключением механизма хранения BDB. Для других двигателей Индекс UNIQUE разрешает несколько значений NULL для столбцов, которые могут содержать NULL.

Вышеприведенная выдержка из MySQL 5.0. MySQL отбросил механизм хранения BDB в 5.1.12. Так что теперь из последней документации :

Для всех механизмов индекс UNIQUE допускает несколько значений NULL для столбцов, которые могут содержать NULL. Если вы задаете значение префикса для столбца в индексе UNIQUE, значения столбца должны быть уникальными в пределах префикса.

...