Ignoriert MySQL Nullwerte für eindeutige Einschränkungen?

Antworten:

422

Ja, MySQL erlaubt mehrere NULL-Werte in einer Spalte mit einer eindeutigen Einschränkung.

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;

Ergebnis:

x
NULL
NULL
1

Dies gilt nicht für alle Datenbanken. Beispielsweise erlaubt SQL Server 2005 und älter nur einen einzelnen NULL-Wert in einer Spalte mit einer eindeutigen Einschränkung.

Mark Byers
quelle
37
ausgezeichneter Kommentar darüber, wie es in MySQL wahr ist, aber nicht unbedingt im Allgemeinen.
user2910265
11
Nach SQLite FAQ , Verhalten ist dieselbe in MySQL, PostgreSQL, SQLite, Oracle und Firebird.
Amir Ali Akbari
4
Bitte aktualisieren Sie Ihre Antwort. SQLServer 2008+ erlaubt dies absolut, Sie müssen lediglich eine WHERE-Klausel hinzufügen ... 2017 sollte sowieso niemand auf einer älteren Version als 2008 sein ... stackoverflow.com/questions/767657/…
Mathieu Turcotte
Es war sehr schwierig, eine Antwort auf diese kleine Funktion zu finden. Dazu muss keine neue Spalte zur Datenbank hinzugefügt oder MySQL in einer sehr alten Anwendung aktualisiert werden. Ich war wirklich auf der Suche nach einer Lösung wie Postgres, bei der ich COALESCE verwenden kann, aber es scheint, dass die Antwort immer ist, dass es kein Fehler ist, wie es entworfen wurde. WHERE column IS NOT NULLScheint mir nicht einmal zu scheitern, da es in meiner Version von MySQL nicht unterstützt wird. Weiß jemand wo ich suchen könnte?
Newdark-It
1
Hinweis: Dies funktioniert auch für eindeutige Indizes mit mehr Spalten. Wenn Sie also möchten, dass die Spalten a, b und c eindeutig sind, können Sie in der Tabelle immer noch doppelte Zeilen mit null, b, c
Mihai Crăiță
111

Aus den Dokumenten :

"Ein UNIQUE-Index erlaubt mehrere NULL-Werte für Spalten, die NULL enthalten können."

Dies gilt für alle Motoren außer BDB .

Matthew Flaschen
quelle
3
BDB ist in aktuellen MySQL-Versionen (ab 5.1.12) nicht mehr verfügbar.
Alim Özdemir
1
Meine Tests scheinen zu zeigen, dass die Java Derby-Datenbank 10.13.1.1. In ähnlicher Weise ist nur eine Null in einer Spalte mit einem eindeutigen Index zulässig.
Chrisinmtown
7

Ich bin mir nicht sicher, ob der Autor ursprünglich nur gefragt hat, ob dies doppelte Werte zulässt oder ob hier eine implizite Frage gestellt wurde: "Wie kann man doppelte NULLWerte bei der Verwendung zulassen UNIQUE?" Oder "Wie kann man nur einen UNIQUE NULLWert zulassen ?"

Die Frage wurde bereits beantwortet. Ja, Sie können doppelte NULLWerte verwenden, während Sie den UNIQUEIndex verwenden.

Da bin ich auf diese Antwort gestoßen, als ich nach "wie man einen UNIQUE NULLWert zulässt" gesucht habe . Für alle anderen, die auf diese Frage stoßen, während sie dasselbe tun, ist der Rest meiner Antwort für Sie ...

In MySQL können Sie keinen UNIQUE NULLWert haben, Sie können jedoch einen UNIQUEleeren Wert haben, indem Sie den Wert einer leeren Zeichenfolge einfügen.

Warnung: Numerisch und andere Typen als Zeichenfolgen können standardmäßig 0 oder einen anderen Standardwert sein.

bluegman991
quelle
1
Einschränkung hat nichts mit dem Index zu tun. Tatsächlich können Sie nicht einmal eine einzelne Zeile mit dem Wert NULL haben, obwohl es keine andere solche Zeile gibt.
Pijusn
1
@Pijusn Was meinst du mit "Einschränkung hat nichts mit Index zu tun?" Auch zu Ihrem zweiten Satz habe ich nie gesagt, dass Sie eine Zeile mit einem NULL-Wert haben könnten. Deshalb habe ich am Anfang des Beitrags angegeben, dass dies nur dann eine Lösung ist, wenn er keine Nullwerte verwendet.
Bluegman991
Was ich damit gemeint habe ist, dass das Hinzufügen eines neuen Elements nicht aufgrund von UNIQUEEinschränkungen fehlschlägt , sondern aufgrund von NOT NULLEinschränkungen. Ich denke, diese Antwort ist für die Frage irrelevant, da es sich bei der Frage speziell um das Verhalten von UNIQUEZwängen handelt.
Pijusn
@ Pijusn Ich habe dich. Sie haben Recht, ich habe den Wortlaut entfernt, der etwas anderes vorschlägt. Ich habe die Frage falsch gelesen. Ich glaube jedoch, dass die Antwort für Benutzer nützlich sein kann, die über diese Frage stolpern, wie ich es getan habe, als sie versucht haben, einen Weg zu finden, einen eindeutigen "Nichts" -Wert zu erhalten, aber fälschlicherweise die Null-Fähigkeit zulassen.
Bluegman991
1
Ich fand diese Antwort nützlich. Es wird jedoch auch hier beantwortet . Dieser Beitrag war das erste Ergebnis meiner Google-Suche, obwohl diese Antwort und die verknüpfte Frage genau das waren, wonach ich gesucht habe.
Kingledion
5

Vermeiden Sie nullbare eindeutige Einschränkungen. Sie können die Spalte jederzeit in eine neue Tabelle einfügen, sie ungleich Null und eindeutig machen und diese Tabelle dann nur dann füllen, wenn Sie einen Wert dafür haben. Dies stellt sicher, dass jede Schlüsselabhängigkeit von der Spalte korrekt erzwungen werden kann, und vermeidet Probleme, die durch Nullen verursacht werden könnten.

nvogel
quelle
6
Ja, aber was Sie vorschlagen, ist fast genau das, was MySQL bereits hinter den Kulissen tut. Warum das Rad neu erfinden, wenn diese Funktionalität eingebaut ist?
ProfileTwist
2
Weil es kein gültiges SQL ist. Ich glaube, dass dieser Tipp für alle nützlich sein wird, die ein datenbankunabhängiges Design wollen (oder brauchen).
Arsen7
@ Arsen7 Was ist, wenn Sie mehrere Unternehmen haben - jedes mit mehreren Kunden? Sie speichern alle Geschäfte mit den E-Mail-Adressen ihrer Kunden in einer Datei. Sie können email_address also nicht eindeutig machen, da verschiedene Unternehmen möglicherweise denselben Client haben. Sie müssen also einen zusammengesetzten eindeutigen Index aus business_id und email_address erstellen. Ist es möglich, dies in eine neue Tabelle zu setzen - wie erklärt?
Gerhard Liebenberg
4
Ich habe einen Fall, in dem eine "E-Mail" -Spalte eindeutig ODER null sein muss. Ich müsste eine neue Tabelle mit einer einzelnen "E-Mail" -Spalte erstellen, wenn ich Ihrem Rat folgen würde. Sich auf dieses MySQL-spezifische Verhalten zu verlassen, ist viel einfacher und das Ergebnis ist dasselbe. Dem Kunden ist es egal, ob ich die E-Mail in einer neuen Tabelle speichere oder nicht. Auch das datenbankunabhängige Design wird allzu oft überbewertet. Bei vielen Projekten können und würden Sie nicht so einfach von einer Datenbank zur anderen wechseln.
Conradkleinespel
1
@djmj sicher, aber funktionale Abhängigkeiten sind für die meisten Menschen wichtig und die nullbare eindeutige Einschränkungsversion erzwingt nicht die gleichen Abhängigkeiten wie die BCNF-Version. Welche Option mehr oder weniger praktisch ist, hängt möglicherweise davon ab, welche Abhängigkeiten für Sie wichtig sind. Deshalb lohnt es sich, eine neue Tabelle zu erstellen.
nvogel