MySQL ignora i valori nulli su vincoli univoci?

Ho una colonna email che voglio essere unica. Ma voglio anche che accetti valori nulli. Il mio database può avere 2 e-mail null in questo modo?

Sì, MySQL consente più NULL in una colonna con un vincolo univoco.

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; 

Risultato:

 x NULL NULL 1 

Questo non è vero per tutti i database. SQL Server, ad esempio, consente solo un singolo valore NULL in una colonna con un vincolo univoco.

Dai documenti :

“un indice UNIQUE consente più valori NULL per colonne che possono contenere NULL”

Questo vale per tutti i motori tranne BDB .

Per MySql, i vincoli univoci ignorano i valori nulli ma non dovrebbero.

Un commento sulla segnalazione di bug mysql # 8173 afferma:

Lo standard ANSI SQL-92 decretava che due valori NULL dovevano essere considerati “non distinti”. La definizione di non distinta nello standard ANSI include due valori che restituiscono TRUE per un test di uguaglianza o due NULL qualsiasi. Questo è il motivo per cui GROUP BY raggruppa tutti i null in una singola partizione.

MySql dovrebbe accettare valori nulli come parte del vincolo univoco.

Non sono sicuro che l’autore in origine stia solo chiedendo se questo consenta o meno valori duplicati o se ci fosse una domanda implicita che chiede, “Come consentire la duplicazione dei valori NULL mentre si utilizza UNIQUE ?” Oppure “Come consentire solo un valore NULL UNIQUE ?”

Alla domanda è già stata data risposta, sì è ansible avere valori NULL duplicati mentre si utilizza l’indice UNIQUE .

Poiché sono incappato in questa risposta durante la ricerca di “come consentire un valore NULL UNIQUE “. Per chiunque altro inciampi su questa domanda mentre fa lo stesso, il resto della mia risposta è per te …

In MySQL non puoi avere un valore NULL UNIQUE , tuttavia puoi avere un valore vuoto UNIQUE inserendo il valore di una stringa vuota.

Avviso: il valore numerico e i tipi diversi dalla stringa possono essere impostati su 0 o su un altro valore predefinito.

Evita i vincoli unici nullable. Puoi sempre inserire la colonna in una nuova tabella, renderla non nulla e univoca e quindi compilare la tabella solo quando ne hai un valore. Ciò garantisce che qualsiasi dipendenza della chiave sulla colonna possa essere applicata correttamente ed evita qualsiasi problema che possa essere causato da null.