web-dev-qa-db-fra.com

MySQL Integer vs NULL

Lorsque vous utilisez des colonnes entières, il est préférable d’avoir 0 ou NULL pour n’indiquer aucune valeur. Par exemple, si une table avait un champ parent_id et qu'une entrée particulière n'avait pas de parent, utiliseriez-vous 0 ou NULL. Dans le passé, j'ai toujours utilisé 0, car je viens d'un monde Java où (avant la version 1.5), les entiers devaient toujours avoir une valeur. Je demande principalement par rapport à la performance, je ne suis pas trop inquiet pour savoir quelle est l'option "plus correcte".

20
monkjack

Utiliser NULL est préférable, pour deux raisons:

  1. NULL signifie que le champ n'a pas de valeur, c'est exactement ce que vous essayez de modéliser.
  2. Si vous décidez d'ajouter des contraintes d'intégrité référentielle dans le futur, vous devrez utiliser NULL.
25
Hosam Aly

Déclarez les colonnes à NOT NULL si possible. Il accélère les opérations SQL en permettant une meilleure utilisation des index et en éliminant les frais généraux pour vérifier si chaque valeur est NULL. Vous économisez également de l'espace de stockage, un bit par colonne. Si vous avez vraiment besoin de valeurs NULL dans vos tables, utilisez-les. Évitez simplement le paramètre par défaut qui autorise les valeurs NULL dans chaque colonne.

MySQL - optimiser la taille des données

22
uldis.zarins

utiliser NULL pour "aucune valeur" est littéralement correct. 0 est une valeur pour un entier, il a donc un sens. NULL otoh signifie littéralement qu'il n'y a rien, donc il n'y a pas de valeur.

Les performances seraient probablement sans importance, mais l'utilisation de NULL pourrait être un peu plus rapide si vous apprenez à coder correctement à l'aide de NULL.

5
jwenting

Vous ne devriez pas vous attendre à voir une différence de performance réelle dans cette vie

3
Brian

UNIQUE( id1, id2 ) ne fonctionnera pas avec les valeurs NULL car cela le permettrait, par exemple 1, null deux fois

par contre, si vous utilisez 0, JOIN atable ON this.extID = atable.ID, la jointure sera exécutée (aucune ligne ne sera jointe) alors que NULL sera simplement ignoré.

Quoi qu'il en soit, je suggère de toujours utiliser "des valeurs vides" (comme 0 ou une chaîne vide) au lieu de NULL sauf si la valeur vide a une signification différente de NULL

et je modifie également les requêtes comme celle-ci: JOIN atable ON this.extID = atable.id AND extID > 0 qui empêche d'exécuter la jointure inutile

2
sveva

Dans votre parent_id, l'exemple 0 est parfaitement valide car il signifie 'root'. Dans la plupart des cas, NULL est un meilleur choix pour «aucune valeur» logiquement.

Cela n’a cependant aucun impact sur les performances.

2
kapa

0 est toujours une valeur valide pour une colonne entière. Par conséquent, vous devez utiliser NULL et autoriser la valeur null sur cette colonne. De même, si vous utilisez une colonne entière uniquement pour des nombres positifs, vous pouvez utiliser -1 sans valeur.

Dans votre exemple de référence parent_id pour utiliser 0, vous pouvez vous assurer qu'il n'y a pas d'identifiant de référence commençant par id 0. 

1
Sachin Shanbhag

Je pense que 0 peut être utilisé à la place de NULL si vous ne vous attendez pas à ce que 0 soit utilisé comme valeur.

C'est par exemple votre colonne est une clé étrangère. Comme les clés étrangères ne commencent normalement pas par 0 mais par 1, cela signifie que vous ne vous attendez pas à ce que le 0 soit utilisé comme valeur.

Vous pouvez ensuite utiliser le 0 pour indiquer l'état de la valeur "Non". Son utilisation dans des jointures ne correspond à aucune colonne de l'autre table. Ainsi, ayant le même effet que NULL.

Mais si vous avez une colonne où le 0 a réellement une signification. Comme par exemple un champ de quantité. Et en dehors de cela, vous devez également exprimer et vider la valeur. Par exemple, pour indiquer que la quantité n'a pas encore été saisie. Ensuite, vous avez besoin d'un NULL pour cela.

J'espère que cela a du sens.

1
chrony