O MySQL ignora valores nulos em restrições exclusivas?

Eu tenho uma coluna de e-mail que quero ser única. Mas também quero aceitar valores nulos. Meu database pode ter 2 e-mails nulos dessa maneira?

Sim, o MySQL permite vários NULLs em uma coluna com uma restrição exclusiva.

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; 

Resultado:

 x NULL NULL 1 

Isso não é verdade para todos os bancos de dados. O SQL Server, por exemplo, permite apenas um único valor NULL em uma coluna que tenha uma restrição exclusiva.

Dos docs :

“um índice UNIQUE permite vários valores NULL para colunas que podem conter NULL”

Isso se aplica a todos os mecanismos, exceto o BDB .

Para MySql, as restrições exclusivas ignoram valores nulos, mas não devem.

Um comentário no relatório de bug do mysql # 8173 declara:

O padrão ANSI SQL-92 decretou que dois valores NULL devem ser considerados “não distintos”. A definição de não distinta no padrão ANSI inclui dois valores que retornam TRUE para um teste de igualdade ou dois NULLs. É por isso que o GROUP BY agrupa todos os nulos em uma única partição.

O MySql deve aceitar valores nulos como parte da restrição exclusiva.

Não tenho certeza se o autor originalmente estava apenas perguntando se isso permite ou não valores duplicados ou se havia uma pergunta implícita perguntando: “Como permitir valores NULL duplicados ao usar UNIQUE ?” Ou “Como permitir somente um valor UNIQUE NULL ?”

A pergunta já foi respondida, sim, você pode ter valores NULL duplicados ao usar o índice UNIQUE .

Desde que eu tropecei nessa resposta enquanto procurava “como permitir um valor UNIQUE NULL “. Para qualquer um que possa se deparar com essa pergunta enquanto faz o mesmo, o resto da minha resposta é para você …

No MySQL você não pode ter um valor UNIQUE NULL , porém você pode ter um valor vazio UNIQUE inserindo com o valor de uma string vazia.

Aviso: Numérico e tipos diferentes de string podem ser padronizados como 0 ou outro valor padrão.

Evite restrições exclusivas anuláveis. Você sempre pode colocar a coluna em uma nova tabela, torná-la não nula e única e preencher essa tabela apenas quando tiver um valor para ela. Isso garante que qualquer dependência de chave na coluna possa ser aplicada corretamente e evita qualquer problema que possa ser causado por nulos.