MySQL ignora i valori null su vincoli univoci?


Risposte:


422

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 2005 e versioni precedenti, ad esempio, consentono solo un singolo valore NULL in una colonna con un vincolo univoco.


37
ottimo commento su come è vero in mysql, ma non necessariamente in generale.
user2910265,

11
Secondo le FAQ di SQLite , il comportamento è lo stesso in MySQL, PostgreSQL, SQLite, Oracle e Firebird.
Amir Ali Akbari

4
Aggiorna la tua risposta. SQLServer 2008+ lo consente assolutamente, devi semplicemente aggiungere una clausola WHERE ... nel 2017, nessuno dovrebbe essere su una versione precedente del 2008 comunque ... stackoverflow.com/questions/767657/…
Mathieu Turcotte

questa piccola funzionalità è stata molto difficile trovare una risposta a cui non è necessario aggiungere una nuova colonna al database o aggiornare MySQL su un'applicazione molto vecchia. Stavo davvero cercando una soluzione come Postgres in cui posso usare COALESCE ma sembra che la risposta sia sempre non un bug come è stata progettata. Nemmeno WHERE column IS NOT NULLsembra fallirmi perché non è supportato nella mia versione di MySQL. Qualcuno sa dove potrei guardare?
newdark-it,

1
nota: questo funziona anche con indici univoci che hanno più colonne. Quindi, se vuoi che le colonne a, bec siano univoche, puoi comunque avere nella tabella doppie file con null, b, c
Mihai Crăiță

111

Dai documenti :

"un indice UNIQUE consente più valori NULL per le colonne che possono contenere NULL"

Questo vale per tutti i motori tranne BDB .


3
BDB non è più disponibile sulle attuali versioni di mysql (a partire dalla 5.1.12).
Alim Özdemir,

1
I miei test sembrano mostrare che il database Java Derby v10.13.1.1. allo stesso modo consente solo un null in una colonna con un indice univoco.
chrisinmtown,

7

Non sono sicuro se in origine l'autore si stesse solo chiedendo se questo consentisse valori duplicati o se ci fosse una domanda implicita qui che chiedeva "Come consentire NULLvalori duplicati durante l'utilizzo UNIQUE?" O "Come consentire un solo UNIQUE NULLvalore?"

Alla domanda è già stata data risposta, sì, è possibile avere NULLvalori duplicati durante l'utilizzo UNIQUEdell'indice.

Dal momento che mi sono imbattuto in questa risposta durante la ricerca di "come consentire un UNIQUE NULLvalore". Per chiunque altro possa inciampare in questa domanda mentre fa lo stesso, il resto della mia risposta è per te ...

In MySQL non puoi avere un UNIQUE NULLvalore, tuttavia puoi avere un UNIQUEvalore vuoto inserendolo con il valore di una stringa vuota.

Avvertenza: valori numerici e tipi diversi da stringa possono essere impostati su 0 o su un altro valore predefinito.


1
Il vincolo non ha nulla a che fare con l'indice. In effetti, non sarai nemmeno in grado di avere una singola riga con valore NULL nonostante il fatto che non esiste un'altra riga del genere.
Pijusn,

1
@Pijusn Cosa intendi con "vincolo non ha nulla a che fare con l'indice?" Anche riguardo alla tua seconda frase, non ho mai detto che potresti avere una riga con un valore NULL, ecco perché ho affermato all'inizio del post, che questa è una soluzione solo se non è impostato sull'uso di valori null.
bluegman991,

Ciò che intendevo dire è che l'aggiunta di un nuovo elemento non riesce a causa del UNIQUEvincolo ma a causa del NOT NULLvincolo. Penso che questa risposta sia irrilevante per la domanda perché la domanda riguarda specificamente il comportamento del UNIQUEvincolo.
Pijusn,

@Pijusn ti ho preso. Hai ragione, ho rimosso la formulazione che suggerisce il contrario. Ho letto male la domanda. Ma credo che la risposta possa ancora essere utile per gli utenti che si imbattono in questa domanda come ho fatto mentre cercavo di trovare un modo per avere un valore "niente" unico, ma stanno erroneamente permettendo l'abilità nulla.
bluegman991,

1
Ho trovato utile questa risposta. Tuttavia, è anche risposto qui . Questo post è stato il primo risultato della mia ricerca su Google, sebbene questa risposta e la domanda collegata fossero ciò che stavo cercando.
Kingledion,

5

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


6
Sì, ma quello che proponi è quasi esattamente ciò che fa mysql dietro le quinte. Perché reinventare la ruota se questa funzionalità è integrata?
ProfileTwist

2
Perché non è SQL valido. Credo che questo suggerimento sarà utile per tutti coloro che desiderano (o necessitano) una progettazione agnostica del database.
Arsen7,

@ Arsen7 E se avessi più aziende, ognuna con più clienti. Tutte le attività commerciali vengono archiviate con gli indirizzi e-mail dei loro clienti in un unico file. Quindi non puoi rendere unico l'indirizzo e-mail perché diverse aziende possono avere lo stesso client. Quindi devi creare un indice univoco composito di business_id e email_address. È possibile inserirlo in una nuova tabella - come spiegato?
Gerhard Liebenberg,

4
Ho un caso in cui una colonna "email" deve essere univoca O nulla. Dovrei creare una nuova tabella con una singola colonna "email" se dovessi seguire i tuoi consigli. Affidarsi a questo comportamento specifico di Mysql è molto più semplice e il risultato è lo stesso. Al cliente non importa se memorizzo l'email in un nuovo tavolo o meno. Inoltre, il design agnostico del database è spesso troppo sopravvalutato. Per molti progetti, non puoi e probabilmente non passeresti facilmente da un DB all'altro.
Conradkleinespel,

1
@djmj certo, ma le dipendenze funzionali sono importanti per la maggior parte delle persone e la versione del vincolo univoco nullable non applica le stesse dipendenze della versione BCNF. Quindi quale opzione è più o meno pratica può dipendere da quali dipendenze sono importanti per te. Ecco perché vale la pena considerare la creazione di una nuova tabella.
nvogel
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.