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
Respuesta
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.
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.
Es la manera correcta. 0 es un valor y null dice que no hay nada en la columna.
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.
- 1. MySQL - Usar clave externa como clave principal también
- 2. ¿Cómo crear una clave externa que también es una clave principal en MySQL?
- 3. clave externa no puede crear
- 4. Clave principal de actualización del Servidor SQL que también es una clave externa en dos tablas
- 5. clave externa condicional PostgreSQL
- 6. ¿La función aleatoria de Java puede ser cero?
- 7. ¿Puede sqlite ser una base de datos inmemory también?
- 8. Puede el tipo INT de MySQL no ser cero NULO
- 9. MySQL - Clave externa única
- 10. Unir tablas, clave externa
- 11. diferencias entre "clave externa" y "restricción de clave externa"
- 12. DbUpdateException con entidades que no exponen propiedades de clave externa
- 13. clave externa a varias tablas
- 14. No se puede establecer una relación de clave externa
- 15. no se puede agregar una clave externa en mysql?
- 16. más de 1 clave externa
- 17. ¿Se puede crear automáticamente un archivo mysqldump que no aplique las restricciones de clave externa?
- 18. Clave múltiple como clave externa (SQL)
- 19. Clave primaria compuesta, clave externa. ¿Referencia a objeto o clave?
- 20. clave externa cakephp no la clave primaria
- 21. Usar clave primaria compuesta como clave externa
- 22. clave natural vs clave sustituta un innodb clave externa
- 23. Clave externa para la clave compuesta
- 24. Entity Framework: campo de clave compuesta no puede ser anulable?
- 25. Python: SyntaxError: la palabra clave no puede ser una expresión
- 26. clave externa de django guardar
- 27. JPA: anotación de clave externa
- 28. Unknown Build Error 'La clave' no puede ser nula '
- 29. ¿Qué significa ser "terminado por un cero"?
- 30. ¿Puede un atributo de base de datos ser clave primaria y extranjera?
¿Qué diferencia tiene si es '0' o' NULL'? Sin mencionar que desde un punto de vista lógico, '0' simplemente no tiene sentido. – Jon