2012-03-18 14 views
8

Cuando uso Foreign Keys en MySQL, obtendré un error si el valor de origen es 0 (porque no hay un registro de destino con ID 0). Por lo tanto, estoy cambiando la columna fuente para que sea NULL, y luego funciona. Sin embargo, no estoy seguro de si esta es la forma correcta de hacerlo. ¿Es el camino correcto, o puedo de alguna manera mantener el ID de origen en 0 en lugar de NULL?Clave externa que también puede ser cero

+0

¿Qué diferencia tiene si es '0' o' NULL'? Sin mencionar que desde un punto de vista lógico, '0' simplemente no tiene sentido. – Jon

Respuesta

19

Las claves externas son restricciones. Esto significa que si el valor de la columna que tiene la clave externa se establece en cualquier cosa (y "cualquier cosa" no incluye NULL), ese valor debe existir en la tabla a la que se hace referencia o MySQL arrojará un error.

Así que, en resumen, se puede establecer ya sea el valor de NULL, eliminar la restricción de clave externa y establezca el valor en lo que desee, incluyendo 0, o añadir un registro con un 0 en la tabla referenciada. De estas opciones, establecer el valor en NULL parece ser la más limpia.

3

Sí, este es el camino correcto. El objetivo de un FK es hacer que exista un registro con el ID referenciado. Entonces, si configura la columna FK a 0, debe haber un registro con ID 0.

La única forma de evitar esto es hacer que la columna FK sea NULL, como lo hizo.

En cualquier caso, ¿por qué querría establecer la columna FK en 0? El valor canónico para "no existe" en SQL es NULL.

4

Es la manera correcta. 0 es un valor y null dice que no hay nada en la columna.

3

usando un NULL es mejor que cero por dos razones. primero, está más claro que es un valor "especial" (no hay nada que obligue a los identificadores de tabla a ser siempre distintos de cero, aunque a menudo es cierto para los identificadores generados automáticamente), y segundo, funciona en SQL con la restricción de clave externa.

por lo que lo que está haciendo es una práctica común: muchas personas usan NULL como un marcador que dice "valor perdido", y eso es lo que espera la restricción de clave externa de SQL.

Otra forma de manejar los valores perdidos es usar una tercera tabla de "enlace" que tenga una entrada solo si hay una conexión entre las dos clases (como lo haría en una relación de muchos a muchos). esto evita la necesidad de un NULL, y es preferido por algunos puristas de bases de datos, pero hace que todo sea más complejo. ver Nullable Foreign Key bad practice? para más discusión.

Cuestiones relacionadas