Unique-Einschränkung der Spalte nur eine NULL-Wert
Einer Unique-Einschränkung erstellt werden können auf eine Spalte, die Null-Werte enthalten kann. Bei den meisten, nur eine einzelne Zeile je enthalten eine NULL in dieser Spalte.
Verstehe ich nicht, warum dies der Fall ist, da, per definition, eine NULL ist nicht gleich dem anderen NULL (da ist NULL wirklich einen unbekannten Wert und einem unbekannten Wert nicht gleich einem anderen unbekannten Wert).
Meine Fragen:
1. Warum ist das so?
2. Ist dies spezifisch für MsSQL?
Habe ich eine Ahnung, dass es da ein Unique-Constraint kann als Referenz für eine Foreign Key-und dass der FK würde sonst nicht wissen, welcher Datensatz in der Tabelle, um die es sich wenn mehr als ein Datensatz mit NULL-Bestand. Aber, es ist nur eine Vermutung.
(Ja, ich verstehe, dass UCs kann sich über mehrere Spalten, aber das ändert nicht die Frage, sondern nur erschwert es ein wenig.)
Fairen Kommentar, aber, Nein, es ist kein string, sondern ein integer-Feld. Sie versuchen zu erfassen oder ändern einer bestehenden integer-Wert NULL Ergebnisse in der "Verletzung der UNIQUE KEY-Einschränkung... Nicht insert duplicate key in object <tablename>..."
InformationsquelleAutor Chris Bargh | 2013-07-05
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ja, es ist "spezifisch", um Microsoft SQL Server (in diesem einige anderen Datenbank-Systeme haben den entgegengesetzten Ansatz, den man erwartet - und das definiert man in der ANSI-Norm, aber ich glaube, es gibt auch andere Datenbank-Systeme, die als SQL-Server).
Wenn Sie eine version von SQL Server unterstützt, gefilterte Indizes, kannst du einen von denen:
(Aber beachten Sie, dass dieser index kann nicht das Ziel eines FK-constraint)
Dem "Warum" es wirklich nur darum geht, das ist, wie es umgesetzt wurde vor langer Zeit (vielleicht vor-standards) und es ist eine jener peinlichen Situationen, wo es jetzt ändern könnte, die potenziell brechen viele bestehende Systeme.
Re: Fremdschlüssel - Sie wäre richtig, wenn es nicht für die Tatsache, dass ein
NULL
Wert in einem Fremdschlüssel-Spalte bewirkt, dass der foreign key nicht überprüft werden - es gibt keine Möglichkeit (in SQL Server) zu verwendenNULL
als eigentlichen Schlüssel.Eine FOREIGN KEY-Einschränkung definitiv erlauben null-Werte in Standard-SQL und SQL Server. Nullable-FK-constraints erlaubt null-Werte, ob oder nicht es sind alle in der parent-Tabelle verwiesen wird.
was ich meinte ist, dass ein
NULL
Wert in die Tabelle verweisen, nicht überprüft in der referenzierten Tabelle.NULL
werden kann ein Schlüssel-Wert.InformationsquelleAutor Damien_The_Unbeliever
Ja, es ist ein SQL Server-Funktion (ein feature von ein paar anderen DBMS), die im Gegensatz zu den ISO-SQL-standard. Es vielleicht nicht viel Sinn angesichts der Logik angewendet, um null-Werte in anderen Orten in SQL - aber dann den ISO-SQL-Standard ist nicht sehr konsistent über seine Behandlung von null-Werten. Das Verhalten der null-uniqueness constraints in SQL-Standard nicht sehr hilfreich ist. Solche Einschränkungen sind nicht unbedingt "unique", denn Sie erlauben doppelte Zeilen. E. g., die Einschränkung
UNIQUE(foo,bar)
erlaubt die folgenden Zeilen, um es gleichzeitig in eine Tabelle:(!)
Vermeiden Sie null-Werte zulässt uniqueness constraints. Es ist in der Regel einfach, verschieben Sie die Spalten in eine neue Tabelle als null- Spalten und legen Sie die Eindeutigkeit gibt. Die Informationen, die gewesen wäre, vertreten durch das Auffüllen von Spalten mit null-Werten kann (vermutlich) dargestellt werden, indem Sie einfach nicht füllen die Spalten in die neue Tabelle an alle.
InformationsquelleAutor nvogel