2011-02-16 12 views
17

Al usar columnas enteras, es mejor tener 0 o NULL para indicar que no hay ningún valor. Por ejemplo, si una tabla tiene un campo parent_id y una entrada en particular no tiene padre, usaría 0 o NULL. En el pasado siempre usé 0, esto es porque vengo de un mundo Java donde (antes de 1.5) los enteros siempre tenían que tener un valor. Estoy preguntando principalmente en relación con el rendimiento, no estoy demasiado preocupado acerca de cuál es la opción "más correcta".Entero MySQL 0 vs NULL

+0

Si no le preocupa cuál es "más correcto", simplemente envíe un cero codificado desde el informe o la aplicación que llama a la base de datos; eso será mucho más rápido que usar cualquier base de datos. –

Respuesta

20

Usando NULL es preferible, por dos razones:

  1. NULL se utiliza en el sentido de que el campo no tiene valor, que es exactamente lo que estamos tratando de modelar.
  2. Si decide agregar algunas restricciones de integridad referencial en el futuro, tendrá que usar NULL.
1

0 sigue siendo un valor válido para una columna entera. Por lo tanto, debe usar NULL y permitir nulo en esa columna. Además, si usa la columna de enteros solo para números positivos, puede usar -1 sin valor.

En el ejemplo de referencia parent_id utilizar 0, es bien hasta que se asegure de que no existen identificadores de referencia a partir de Identificación 0.

4

usando NULL para "ningún valor" es literalmente correcta. 0 es un valor para un entero, por lo tanto, tiene un significado. NULL otoh significa literalmente que no hay nada, por lo que no hay ningún valor.

El rendimiento probablemente sea irrelevante, pero usar NULL puede ser algo más rápido si aprende a codificar usando NULL correctamente.

3

Usted no debe esperar a ver ninguna diferencia en el rendimiento de la vida real de esta

+1

poco a poco. guardar de todo. se amontona! – ninjabber

2

En su ejemplo parent_id 0 es perfectamente válido, ya que significa 'raíz'. En la mayoría de los casos, NULL es una mejor opción para 'sin valor' lógicamente.

No tiene ningún impacto en el rendimiento que yo sepa, sin embargo.

15

Declarar columnas a ser NOT NULL si es posible. Hace que las operaciones SQL sean más rápidas, al permitir un mejor uso de los índices y al eliminar los gastos generales para probar si cada valor es NULO. También ahorras algo de espacio de almacenamiento, un bit por columna. Si realmente necesita valores NULL en sus tablas, úselos. Solo evite la configuración predeterminada que permite valores NULOS en cada columna.

MySQL - optimizing data size

+1

+1. Todavía diría que "no hay valor" para esta columna "es motivo suficiente para usar' NULL'. Me gustaría comparar con y sin antes ir contra el sentido común. Esta cita solo habla de columnas en las que realmente, en realidad, nunca vas a usarla de esa manera, AFAICT. –

1

Creo 0 se puede utilizar en lugar de NULL si en realidad no se espera 0 para ser utilizado como un valor.

Por ejemplo, su columna es una clave externa. Como las claves externas normalmente no comienzan con 0, sino que comienzan con 1, significa que no se espera que el 0 se use como valor.

Puede utilizar el 0 para denotar el estado 'No'. Usarlo en uniones no coincidiría con ninguna columna en la otra tabla. Por lo tanto, tiene el mismo efecto que NULL.

Pero si tiene una columna donde el 0 en realidad tiene un significado. Como por ejemplo un campo de cantidad. Y aparte de eso, también necesita expresar y vaciar el valor. Por ejemplo, para indicar que la cantidad aún no se ha ingresado. Entonces necesitas un NULL para eso.

Espero que tenga sentido.

2

UNIQUE(id1, id2) no funcionará con valores nulos, ya que permitiría, por ejemplo, dos veces 1, null

por el contrario si se utiliza 0, JOIN atable ON this.extID = atable.ID la unión será ejecutado (con lo que no se unió a las filas), mientras que NULL acaba de ser ignorado

de todos modos Es mejor utilizar siempre los "valores vacíos" (como 0 o vacío de cuerda) en lugar de NULL a menos que el valor vacío tiene un significado diferente de NULL

y también modificar consultas de este modo: JOIN atable ON this.extID = atable.id AND extID > 0 que impide ejecutar la unión inútil