Por favor aclara dos cosas para mí:
- ¿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 algunas aplicaciones mías puedo ingresar NULL
tanto en Oracle como en SQL Server, y no sé por qué.
sql
sql-server
oracle
foreign-keys
Enjambres
fuente
fuente
Respuestas:
Respuesta corta: Sí, puede ser NULL o duplicado.
Quiero explicar por qué una clave externa puede ser nula o ser única o no única. Primero recuerde que una clave externa simplemente requiere que el valor en ese campo debe existir primero en una tabla diferente (la tabla principal). Eso es todo un FK es 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 un vendedor asignado y un cliente. Por lo tanto, su tabla de propuesta tendría dos claves foráneas, una con la ID del cliente y otra con la 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 todavía no hay nadie libre para trabajar en él), por lo que la ID del cliente se completa pero la ID del representante de ventas puede ser nula. En otras palabras, generalmente necesita la capacidad de tener un FK nulo cuando puede no conocer 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 tiene 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 único o no único se relaciona con si la tabla tiene una relación uno-uno o uno-muchos con la tabla principal. Ahora, si tiene una relación uno a uno, es posible que pueda tener todos los datos en una tabla, pero si la tabla se está ampliando demasiado o si los datos están en un tema diferente (el empleado - ejemplo de seguro @tbone dio por ejemplo), entonces quieres tablas separadas con un FK. Entonces querrá hacer que este FK sea también el PK (que garantiza la unicidad) o imponerle una restricción única.
La mayoría de las FK son para una relación de uno a muchos y eso es lo que obtienes de una FK sin agregar una restricción adicional en el campo. Por lo tanto, tiene una tabla de pedidos y la tabla de detalles del pedido, por ejemplo. Si el cliente ordena diez artículos a la vez, tiene un pedido y diez registros detallados que contienen el mismo ID de pedido que el FK.
fuente
NULL
en una tabla por varios correosNULL
electrónicos en una tabla diferente.1 - Sí, desde al menos SQL Server 2000.
2 - Sí, siempre que no sea una
UNIQUE
restricción o esté vinculado a un índice único.fuente
De la boca del caballo:
Mira esto:
Enlace Oracle 11g
fuente
Sí, la clave foránea puede ser nula como se indicó anteriormente por los programadores senior ... Agregaría otro escenario donde la clave foránea deberá ser nula ... supongamos que tenemos tablas de comentarios, imágenes y videos en una aplicación que permite comentarios sobre imágenes y videos En la tabla de comentarios podemos tener dos claves extranjeras PicturesId, y VideosId junto con la clave primaria CommentId. Entonces, cuando comentas en un video solo se requerirá VideosId y pictureId sería nulo ... y si comentas solo en una foto, se requeriría PictureId y VideosId sería nulo ...
fuente
depende de qué papel
foreign key
juega esto en su relación.foreign key
también estákey attribute
en su relación, entonces no puede ser NULLforeign key
es un atributo normal en su relación, puede ser NULL.fuente
Aquí hay un ejemplo usando la sintaxis de Oracle:
Primero creemos una tabla COUNTRY
Crea la tabla PROVINCIA
Esto funciona perfectamente bien en Oracle. Observe que la clave externa COUNTRY_ID en la segunda tabla no tiene "NOT NULL".
Ahora, para insertar una fila en la tabla PROVINCE, es suficiente especificar solo PROVINCE_ID. Sin embargo, si elige especificar un COUNTRY_ID también, debe existir en la tabla COUNTRY.
fuente
Por defecto no hay restricciones en la clave externa, la clave externa puede ser nula y duplicada.
mientras crea una tabla / modifica la tabla, si agrega alguna restricción de unicidad o no nula, entonces solo no permitirá los valores nulos / duplicados.
fuente
En pocas palabras, las relaciones "no identificables" entre entidades forman parte del modelo ER y están disponibles en Microsoft Visio cuando se diseña el diagrama ER. Esto es necesario para imponer la cardinalidad entre entidades de tipo "cero o más que cero" o "cero o uno". Tenga en cuenta este "cero" en cardinalidad en lugar de "uno" en "uno a muchos".
Ahora, un ejemplo de relación no identificable donde la cardinalidad puede ser "cero" (no identificable) es cuando decimos que un registro / objeto en una entidad-A "puede" o "no puede" tener un valor como referencia para el registro / s en otra Entidad-B.
Como existe la posibilidad de que un registro de la entidad-A se identifique con los registros de otra Entidad-B, por lo tanto, debe haber una columna en la Entidad-B para tener el valor de identidad del registro de la Entidad-B. Esta columna puede ser "Nula" si ningún registro en la Entidad-A identifica el / los registro / s (u objeto / s) en la Entidad-B.
En el Paradigma orientado a objetos (mundo real), hay situaciones en las que un objeto de Clase B no necesariamente depende (fuertemente acoplado) del objeto de clase A para su existencia, lo que significa que la Clase B está débilmente acoplada con Clase- A tal que la Clase A pueda "Contener" (Contención) un objeto de la Clase A, en oposición al concepto de objeto de la Clase B debe tener (Composición) un objeto de la Clase A, para su (objeto de clase- B) creación.
Desde el punto de vista de la consulta SQL, puede consultar todos los registros en la entidad-B que "no son nulos" para la clave externa reservada para la entidad-B. Esto traerá todos los registros que tengan cierto valor correspondiente para las filas en la Entidad-A alternativamente, todos los registros con valor Nulo serán los registros que no tienen ningún registro en la Entidad-A en la Entidad-B.
fuente
Creo que es mejor considerar la posible cardinalidad que tenemos en las tablas. Podemos tener una cardinalidad mínima posible cero. Cuando es opcional, la participación mínima de tuplas de la tabla relacionada podría ser cero. Ahora se enfrenta a la necesidad de que los valores de clave externa sean nulos.
Pero la respuesta es que todo depende del negocio.
fuente
La idea de una clave externa se basa en el concepto de hacer referencia a un valor que ya existe en la tabla principal. Es por eso que se llama una clave foránea en la otra tabla. Este concepto se llama integridad referencial. Si una clave externa se declara como un campo nulo, violará la lógica misma de la integridad referencial. ¿A qué se referirá? Solo puede referirse a algo que está presente en la tabla principal. Por lo tanto, creo que sería incorrecto declarar un campo de clave externa como nulo.
fuente
NULL
, pero lo que dice la integridad referencial es que si hace referencia a "algo", debe estar allí.Creo que la clave externa de una tabla también es la clave principal de otra tabla, por lo que no permite valores nulos, por lo que no se trata de tener un valor nulo en la clave externa.
fuente