¿Puede una clave externa ser NULL y/o duplicarse?
Por favor aclarenme dos cosas:
- ¿Puede una clave externa ser NULL?
- ¿Se puede duplicar una clave externa?
Por lo que sé, NULL
no debería usarse en claves externas, pero en alguna de mis aplicaciones puedo ingresar NULL
tanto en Oracle como en SQL Server, y no sé por qué.
Respuesta corta: Sí, puede ser NULL o duplicarse.
Quiero explicar por qué es posible que una clave externa deba ser nula o que sea única o no única. Primero recuerde que una clave externa simplemente requiere que el valor en ese campo exista primero en una tabla diferente (la tabla principal). Eso es todo lo que es un FK por definición. Nulo por definición no es un valor. Nulo significa que aún no sabemos cuál es el valor.
Déjame darte un ejemplo de la vida real. Supongamos que tiene una base de datos que almacena propuestas de ventas. Supongamos además que cada propuesta solo tiene asignado un vendedor y un cliente. Por lo tanto, su tabla de propuestas tendría dos claves externas, una con el ID del cliente y otra con el ID del representante de ventas. Sin embargo, en el momento en que se crea el registro, no siempre se asigna un representante de ventas (porque nadie está libre para trabajar en él todavía), por lo que se completa el ID del cliente, pero el ID del representante de ventas puede ser nulo. En otras palabras, normalmente necesita la capacidad de tener un FK nulo cuando es posible que no conozca su valor en el momento en que se ingresan los datos, pero sí conoce otros valores en la tabla que deben ingresarse. Para permitir nulos en un FK generalmente todo lo que tienes que hacer es permitir nulos en el campo que tiene el FK. El valor nulo está separado de la idea de que sea un FK.
Si es única o no se relaciona con si la tabla tiene una relación de uno o muchos con la tabla principal. Ahora bien, si tiene una relación uno-uno, es posible que pueda tener todos los datos en una tabla, pero si la tabla se está volviendo demasiado amplia o si los datos están sobre un tema diferente (el empleado - ejemplo de seguros que dio @tbone por ejemplo), entonces querrás tablas separadas con un FK. Entonces querrás hacer que este FK sea también el PK (que garantiza la unicidad) o ponerle una restricción única.
La mayoría de los FK son para una relación de uno a muchos y eso es lo que se obtiene de un FK sin agregar una restricción adicional en el campo. Entonces tiene una tabla de pedidos y la tabla de detalles del pedido, por ejemplo. Si el cliente pide diez artículos a la vez, tiene un pedido y diez registros de detalles del pedido que contienen el mismo ID de pedido que el FK.
1 - Sí, al menos desde SQL Server 2000.
2 - Sí, siempre que no sea una UNIQUE
restricción ni esté vinculado a un índice único.