Hören Sie auf, den Ausdruck "Nullwert" zu verwenden, da Sie sonst in die Irre geführt werden. Verwenden Sie stattdessen den Ausdruck "Null-Markierung" - eine Markierung in einer Spalte, die angibt, dass der tatsächliche Wert in dieser Spalte fehlt oder nicht anwendbar ist (beachten Sie jedoch, dass die Markierung nicht angibt, welche dieser Optionen tatsächlich der Fall ist¹).
Stellen Sie sich nun Folgendes vor (wobei die Datenbank die modellierte Situation nicht vollständig kennt).
Situation Database
ID Code ID Code
-- ----- -- -----
1 A 1 A
2 B 2 (null)
3 C 3 C
4 B 4 (null)
Die Integritätsregel, die wir modellieren, lautet "Der Code muss eindeutig sein". Die reale Situation verstößt dagegen, sodass die Datenbank nicht zulässt, dass sich die Elemente 2 und 4 gleichzeitig in der Tabelle befinden.
Der sicherste und am wenigsten flexible Ansatz besteht darin, Nullmarkierungen im Feld Code nicht zuzulassen, sodass keine inkonsistenten Daten möglich sind. Der flexibelste Ansatz besteht darin, mehrere Nullmarken zuzulassen und sich bei der Eingabe von Werten um die Eindeutigkeit zu sorgen.
Die Sybase-Programmierer entschieden sich für den etwas sicheren, nicht sehr flexiblen Ansatz, nur einen Null-Marker in der Tabelle zuzulassen - worüber sich Kommentatoren seitdem beschwert haben. Microsoft hat dieses Verhalten fortgesetzt, ich denke für die Abwärtskompatibilität.
¹ Ich bin mir sicher, dass ich irgendwo gelesen habe, dass Codd überlegt hat, zwei Null-Marker zu implementieren - einen für unbekannt, einen für nicht zutreffend -, diesen aber abgelehnt habe, aber ich kann den Verweis nicht finden. Erinnere ich mich richtig?
PS Mein Lieblingszitat zu null: Louis Davidson, "Professionelles SQL Server 2000-Datenbankdesign", Wrox Press, 2001, Seite 52. "Auf einen einzigen Satz gebracht: NULL ist böse."