¿MySQL ignora valores nulos en restricciones únicas?

Tengo una columna de correo electrónico que quiero que sea única. Pero también quiero que acepte valores nulos. ¿Puede mi base de datos tener 2 correos electrónicos nulos de esa manera?

Sí, MySQL permite múltiples NULLs en una columna con una restricción única.

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 

Esto no es cierto para todas las bases de datos. SQL Server, por ejemplo, solo permite un único valor NULL en una columna que tiene una restricción única.

De los documentos :

“un índice ÚNICO permite valores NULL múltiples para columnas que pueden contener NULL”

Esto se aplica a todos los motores excepto a BDB .

Para MySql, las restricciones únicas ignoran los valores nulos, pero no deberían.

Un comentario sobre el informe de errores de mysql # 8173 dice:

El estándar ANSI SQL-92 decretó que dos valores NULL deberían considerarse “no distintos”. La definición de no distintivo en el estándar ANSI incluye dos valores que devuelven TRUE para una prueba de igualdad o dos cualquiera NULL. Es por esto que GROUP BY agrupa todos los nulos en una sola partición.

MySql debe aceptar valores nulos como parte de la restricción única.

No estoy seguro si originalmente el autor solo preguntaba si esto permite o no valores duplicados o si había una pregunta implícita preguntando: “¿Cómo permitir valores duplicados NULL mientras se usa UNIQUE ?” O “¿Cómo solo permite un UNIQUE valor NULL ?”

La pregunta ya ha sido respondida, sí, puede tener valores NULL duplicados al usar el índice UNIQUE .

Desde que me encontré con esta respuesta mientras buscaba “cómo permitir un UNIQUE valor NULL “. Para cualquier otra persona que pueda tropezar con esta pregunta mientras hace lo mismo, el rest de mi respuesta es para usted …

En MySQL no puede tener un valor NULL UNIQUE , sin embargo, puede tener un UNIQUE valor vacío insertando con el valor de una cadena vacía.

Advertencia: los valores numéricos y los tipos que no sean cadenas pueden tener como valor predeterminado 0 u otro valor predeterminado.

Evite las restricciones únicas anulables. Siempre puede colocar la columna en una nueva tabla, hacer que no sea nula y única y completarla solo cuando tenga un valor para ella. Esto garantiza que cualquier dependencia de clave en la columna se puede aplicar correctamente y evita cualquier problema que pueda ser causado por nulos.