Unterschied zwischen NOT NULL und NULL?

7 Antworten

NOT NULL kann auch ein Merkmal für ein Datenfeld bei der Definition einer Tabelle sein. Für Datenfelder, die für den Primärschlüssel oder einen eindeutigen Index verwendet werden muss NOT NULL angegen werden und bedeutet, dass in diesen Feldern immer ein realer Wert stehen muss. Ohne diese Angabe kann man ein Feld auf NULL setzen, was soviel bedeutet, dass für dieses Feld kein Wert existiert.

Bei der Abfrage muss man ggf genau angeben, was mit den Feldern, die auf NULL gesetzt sind geschehen soll.

Wenn man z.B. ein Feld alternativ auf gleich einem Wert und dann auf ungleich dem selben Wert abfragt, bekommt man beim Ergebnis die auf NULL stehenden Werte weder bei der einen noch bei der anderen Abfrage. Um diese Werte zu bekommen (falls man sie haben möchte) muss man gezielt danach fragen: WHERE (feld = 0 OR feld IS NULL).

Wenn man z.B. jeden Tag die Temperatur misst und dies in einer Tabelle dokumentiert, würde man eine vergessene Messung mit NULL angeben können, was dann soviel bedeuten würde, dass es für diesen Tag keine Messung gibt. Bei der Berechnung der Durchschnittstemperatur würde dieser Tag nicht berücksichtigt. 

> Unterschied zwischen NOT NULL und NULL

Wenn Du von einem Datensatz (= eine Zeile der Tabelle) nur einen Teil der Werte kennst, kannst Du diesen Datensatz trotzdem in die Tabelle schreiben und die unbekannten Werte dabei einfach weglassen - aber nur bei Feldern, die nullable sind, also mit NULL definiert wurden. Wobei es von der konkreten Datenbank abhängt, was sie nimmt, wenn man weder NULL noch NOT NULL angibt. Beispiel

Tabelle (Kundennummer, Name, Geburtsdatum), aber der Geburtstag eines neuen Kunden ist unbekannt. Wenn Geburtsdatum nullable ist, kein Problem, legst Du einen neuen Datensatz an nur mit Nummer und Name.

Wenn aber Geburtsdatum NOT NULL ist, ergibt der Versuch, einen Datensatz ohne Geburtsdatum einzutragen, einen Fehler. Als Krücke kann man dann ein Datum definieren, das die Bedeutung "unbekannt" haben soll. 1.1.1800 wäre ein guter Wert, sofern die Datenbank nur über lebende oder vor kurzem verstorbene Personen geht. Aber anders als bei NULL gilt das nur so lange als "unbekannt", wie der Programmierer beim Schreiben seiner Datenbankabfrage daran denkt, dass er das nicht als echtes Datum ansehen darf.

Eine Abfrage auf Volljährigkeit, die prüft, ob das Geburtsdatum mehr als 18 Jahre in der Vergangenheit liegt, funktioniert nur mit der zusätzlichen Prüfung AND Geburtsdatum != '1.1.1800'


NULL schreibst du, wenn du etwas nicht weißt aber auch nicht einfach ein Leerzeichen hinschreiben möchtest. 

z.B. wenn du eine Tabelle adresse hast aber nur den Namen und nicht die Telefonnummer weißt:

insert into adresse values ('Name', NULL);

Wenn du aber ein Leerzeichen einfügst anstatt eine NULL, dann hat diese Person leider keine Telefonnummer:

insert into adresse values ('Name2', ' ');

Willst du jetzt alle Personen wissen, von denen du die Telefonnummer nicht kennst (alle mit NULL), dann schreibst du:

select * from adresse where telefonnummer IS NULL;

Willst du alle Namen wissen, von denen du die Telefonnummer weißt oder du weißt, dass sie keine Telefonnr. haben:

select * from adresse where telefonnummer IS NOT NULL;

Hoffe, du hast es einigermaßen verstanden :)


mepeisen  03.12.2015, 11:06

Und bezogen auf die Tabellendefinition selbst:

NULL bedeutet: Die Spalte darf auch "leer" sein (im Sinne wie UweKeim es erklärt hat)

NOT NULL bedeutet: In der Spalte muss zwingend immer ein gültiger Wert stehen und sei es bei Textspalten beispielsweise ein Leerzeichen oder auch ein Leerstring

UweKeim  03.12.2015, 11:08
@mepeisen

Ja, z.B. darf der Primary Key niemals NULL sein aber der wird immer so definiert, dass er nicht NULL sein kann.

ich bin gerade dabei erste SQL-Befehle über phpmyadmin zu schreiben.

Ich tippe ja, daß du dich z. Z. mit DML und nicht mit SQL beschäftigst.

die frage steht eigentlich schon oben, ich würde gerne wissen was der Unterschied zwischen NOT NULL und NULL ist?

Ein Feld, welches auf NOT NULL gesetzt ist, muß einen dem Feldtyp entsprechenden Wert erhalten. Z. B. wäre bei einem String ein Leerstring "" ein dem Feldtyp entsprechender Wert, bei einem Integer 0. Was nicht funktioniert ist die Zuweisung von NULL an ein solches Feld.

Wenn du dich dann mal mit SQL beschäftigst kannst du Felder, welche auf NULL gesetzt werden dürfen, mit IS NULL bzw. IS NOT NULL abfragen. Bitte laß dies sein, falls es sich vermeiden läßt. Ich mußte so eine Lösung einmal verwenden (und der Feldtyp war TEXT (unter Oracle), da gibts keine "="-Vergleich), da für die Produktivdatenbank kein Admin erreichbar war, dieses Feld aus unerklärlichen Gründen angelegt und nicht genutzt war und die Lösung vor einem 1.1. online gehen mußte.


TomRichter  05.12.2015, 15:41

> Bitte laß dies sein, falls es sich vermeiden läßt

Kein guter Rat. "Mach Dich schlau, bevor Du eine Datenbank designst" wäre mein Vorschlag.

Vermeiden kann man eine NOT NULL Definition fast immer - außer bei Feldern, die zum Primärschlüssel gehören. Aber in den Fällen, in denen aus Sicht der Anwendung ein Feld bestückt sein muss (beispielsweise Tabelle Zustelladresse, Feld Ort), erschwert es die Programmierung nur, wenn die Datenbank ein solches Feld mit NULL zulässt.

NULL beschreibt einen uninitialisierten Zustand. 

In dem Speicherbereich kann alles Mögliche drin stehen. Die Datenbank liest aber nicht den genauen Inhalt aus, sondern drückt mit NULL aus, dass man mit dem Inhalt nichts anfangen könnte, weil da beliebiges Wirrwarr drin stehen könnte.

NULL muss häufig gesondert abgefragt werden, also mit IS (NOT) NULL. 
= NULL oder <> NULL funktionieren i. d. R. nicht.

Woher ich das weiß:Berufserfahrung – Programmierer

wotan38  20.11.2016, 12:29

Bei Null gibt es keinen Speichernbereich, weil nichts gespeichert wird. Genau das besagt das Attribut NULL. Es ist auch kein beliebiges Wirrwarr oder  "alles Mögliche" vorhanden.

Ein Datensatz kann ein Feld enthalten, für das kein Wert existiert, weil kein Wert angegeben wurde. Bei der Definition jedes Feldes muss festgelegt sein, ob NULL zugelassen wird oder nicht. NULL selbst ist kein Wert, sondern ein Zustand. Es kann weder einem Wert gleich noch ungleich sein.