web-dev-qa-db-de.com

MySQL Integer vs. NULL

Wenn Sie Ganzzahlspalten verwenden, ist es besser, 0 oder NULL zu haben, um keinen Wert anzugeben. Wenn eine Tabelle beispielsweise ein Feld parent_id und ein bestimmter Eintrag kein übergeordnetes Element hätte, würden Sie 0 oder NULL verwenden. Ich habe in der Vergangenheit immer 0 verwendet, weil ich aus einer Java-Welt komme, in der (vor 1.5) ganze Zahlen immer einen Wert haben mussten. Ich frage vor allem in Bezug auf die Leistung, ich mache mir nicht zu viele Sorgen darüber, welche Option "richtiger" ist.

20
monkjack

Die Verwendung von NULL ist aus zwei Gründen vorzuziehen:

  1. NULL bedeutet, dass das Feld keinen Wert hat. Dies ist genau das, was Sie zu modellieren versuchen.
  2. Wenn Sie in der Zukunft einige referenzielle Integritätsbedingungen hinzufügen möchten, müssen Sie NULL verwenden.
25
Hosam Aly

Deklarieren Sie Spalten so, dass sie NICHT NULL sind. Dadurch werden SQL-Vorgänge schneller, da Indizes besser genutzt werden können und der Overhead entfällt, um zu testen, ob jeder Wert NULL ist. Sie sparen auch etwas Speicherplatz, ein Bit pro Spalte. Wenn Sie wirklich NULL-Werte in Ihren Tabellen benötigen, verwenden Sie diese. Vermeiden Sie einfach die Standardeinstellung, die NULL-Werte in jeder Spalte zulässt.

MySQL - Datengröße optimieren

22
uldis.zarins

die Verwendung von NULL für "kein Wert" ist buchstäblich korrekt. 0 ist ein Wert für eine ganze Zahl und hat daher eine Bedeutung. NULL ooh bedeutet wörtlich, dass es nichts gibt, also gibt es keinen Wert.

Die Leistung ist wahrscheinlich irrelevant, aber die Verwendung von NULL ist möglicherweise etwas schneller, wenn Sie lernen, NULL korrekt zu verwenden.

5
jwenting

Sie sollten davon ausgehen, dass es keinen echten Leistungsunterschied gibt

3
Brian

UNIQUE( id1, id2 ) funktioniert nicht mit Nullwerten, da 1, null beispielsweise zweimal zulässig wäre

wenn Sie dagegen 0 verwenden, wird JOIN atable ON this.extID = atable.ID der Join ausgeführt (dh es werden keine Zeilen verbunden), während NULL ignoriert wird

Ich schlage jedoch vor, immer "leere Werte" (wie 0 oder leere Zeichenfolge) anstelle von NULL zu verwenden, es sei denn, der leere Wert hat eine andere Bedeutung als NULL

und ich modifiziere auch Abfragen wie folgt: JOIN atable ON this.extID = atable.id AND extID > 0, der die Ausführung des nutzlosen Joins verhindert

2
sveva

In Ihrer parent_id ist das Beispiel 0 vollkommen gültig, da es für 'root' steht. In den meisten Fällen ist NULL eine logisch bessere Wahl für "Kein Wert".

Es hat jedoch keine Auswirkungen auf die Leistung, die ich kenne.

2
kapa

0 ist immer noch ein gültiger Wert für eine ganzzahlige Spalte. Daher müssen Sie NULL verwenden und für diese Spalte NULL zulassen. Wenn Sie eine Ganzzahlspalte nur für positive Zahlen verwenden, können Sie -1 für keinen Wert verwenden.

In Ihrem Beispiel für parent_id reference, 0 zu verwenden, ist in Ordnung, bis Sie sicherstellen, dass es keine Referenz-IDs gibt, die mit ID 0 beginnen. 

1
Sachin Shanbhag

Ich denke, 0 kann anstelle von NULL verwendet werden, wenn Sie nicht erwarten, dass 0 als Wert verwendet wird.

Das ist zum Beispiel Ihre Spalte ist ein Fremdschlüssel. Da Fremdschlüssel normalerweise nicht mit 0 beginnen, sondern mit 1 beginnen, würden Sie nicht erwarten, dass 0 als Wert verwendet wird.

Sie können dann die 0 verwenden, um den Wertstatus 'No' anzugeben. Die Verwendung in Joins würde mit keiner Spalte in der anderen Tabelle übereinstimmen. Also die gleiche Wirkung wie NULL.

Aber wenn Sie eine Spalte haben, in der die 0 tatsächlich eine Bedeutung hat. Wie zum Beispiel ein Mengenfeld. Abgesehen davon müssen Sie auch den Wert ausdrücken und leeren. Zum Beispiel, um anzuzeigen, dass die Menge noch nicht eingegeben wurde. Dann brauchst du dafür eine NULL.

Hoffe das macht Sinn.

1
chrony