Einzigartige Constraint-Spalte kann nur einen NULL-Wert enthalten

Eine eindeutige Einschränkung kann auf einer Spalte erstellt werden, die NULLs enthalten kann. Allerdings darf höchstens eine einzige Zeile jemals ein NULL in dieser Spalte enthalten.

Ich verstehe nicht, warum dies der Fall ist, da definitionsgemäß ein NULL nicht gleich einem anderen NULL ist (da NULL wirklich ein unbekannter Wert ist und ein unbekannter Wert nicht gleich einem anderen unbekannten Wert entspricht).

Meine Fragen: 1. Warum ist das so? 2. Ist das spezifisch für MsSQL?

Ich habe eine Ahnung, dass es ist, weil eine Unique Constraint als referencefeld für einen Fremdschlüssel fungieren kann und dass die FK sonst nicht wissen würde, welche Aufzeichnung in der referencetabelle, auf die sie verweist, wenn mehr als ein datasatz mit NULL existierte. Aber es ist nur eine Ahnung.

(Ja, ich verstehe, dass UCs ​​über mehrere Spalten hinweg sein können, aber das ändert nicht die Frage, sondern es macht einfach nur ein bisschen kompliziert.)

Ja, es ist "spezifisch" für Microsoft SQL server (in dem, dass einige andere databasesysteme den umgekehrten Ansatz haben, den, den man erwartet hat – und derjenige, der im ANSI-Standard definiert ist, aber ich glaube, dass es andere databasesysteme gibt, die mit SQL übereinstimmen server).

Wenn Sie an einer Version von SQL server arbeiten, die gefilterte Indizes unterstützt, können Sie eine davon anwenden:

CREATE UNIQUE INDEX IX_T ON [Table] ([Column]) WHERE [Column] IS NOT NULL 

(Aber beachten Sie, dass dieser Index nicht das Ziel einer FK-Einschränkung sein kann)


Das "Warum" davon kommt einfach nur darauf an, so ist es schon längst implementiert (evtl. Vorstandards) und es ist eine dieser schwierigen Situationen, in denen es sich ändern kann, könnte jetzt eine Menge bestehender Systeme brechen.

Re: Fremdschlüssel – das wäre richtig, wenn es nicht darum geht, dass ein NULL Wert in einer Fremdschlüsselspalte den Fremdschlüssel nicht überprüft hat – es gibt keine Möglichkeit (in SQL server), NULL als tatsächlichen zu verwenden Schlüssel.

Ja, es ist eine SQL server-function (und eine function von einigen anderen DBMS), die dem ISO-SQL-Standard zuwiderläuft. Es ist vielleicht nicht viel sinnvoll angesichts der Logik, die auf nulls an anderen Orten in SQL angewendet wird – aber dann ist der ISO SQL Standard nicht sehr konsistent über seine Behandlung von Nullen entweder. Das Verhalten von nullable Eindeutigkeitsbeschränkungen in Standard SQL ist nicht sehr hilfreich. Solche Einschränkungen sind nicht unbedingt "einmalig", weil sie doppelte Zeilen erlauben. ZB erlaubt die Einschränkung UNIQUE(foo,bar) , dass die folgenden Zeilen gleichzeitig in einer Tabelle existieren:

 foo bar ------ ------ 999 NULL 999 NULL 

(!)

Vermeiden Sie nullable Einzigartigkeitsbeschränkungen. Es ist normalerweise einfach, die Spalten zu einer neuen Tabelle als nicht nullable Spalten zu bewegen und die Einzigartigkeitsbeschränkung dort zu setzen. Die Informationen, die durch das Bevölkern dieser Spalten mit Null dargestellt worden sind, können (vermutlich) durch einfaches Befüllen dieser Spalten in der neuen Tabelle überhaupt dargestellt werden.