única unica una tabla ser secundaria puede nula llave foránea foranea datos creada compuesta como clave agregar database foreign-key-relationship

database - unica - ¿Algún ejemplo de una clave foránea nullable necesaria?



una llave foranea puede ser unica (8)

Customers customer_id Orders order_id customer_id fk

Si tengo dos tablas y defino una clave foránea en customer_id en la tabla Pedidos, al permitir que sea nula, estoy diciendo que puedo tener una orden que no tenga un cliente asociado. Como tal, la noción de una clave externa anulable parece en desacuerdo con el propósito de una clave foránea, que es hacer cumplir esta restricción.

¿Hay un ejemplo simple de una situación en la que sería necesaria una clave externa anulable? ¿O un argumento a favor de permitirlos?


Como tal, la noción de una clave externa anulable parece en desacuerdo con el propósito de una clave foránea, que es hacer cumplir esta restricción.

El propósito de una clave foránea es hacer explícito el concepto de que el entero aleatorio en la tabla Pedidos en realidad se refiere a un artículo en la tabla Clientes. En realidad, hacer cumplir eso como una restricción es incidental.


Hay otra situación en la que puedo pensar:

Dentro de una tabla, tiene un campo de ID que identifica de manera única ese registro. Ese mismo registro puede (o no) tener un padre soltero.

Tabla con las siguientes columnas:

  • id como un entero, autoincremento, no admite nulos
  • parentid como un entero, anulable.

Con una restricción de clave externa, puede asegurarse de que si el campo no es nulo, se refiere a un padre válido. Además, si intenta eliminar el registro principal sin corregir los elementos secundarios, no se puede eliminar el elemento principal.


Imagine una mesa que contenga los TODOs de un equipo. Si aún no se ha asignado un TODO a un miembro del equipo, su user_id es NULL . Si no es NULL , es una clave externa a la tabla de users .


No, claves foráneas que aceptan nulos nunca son necesarias .

Siempre puede normalizar una relación opcional de 1 a muchos. Tomando su ejemplo, puede tener las siguientes tablas:

Customers: customer_id, ... Orders: order_id, ... OrdersCustomers: order_id, customer_id UNIQUE(order_id)

Las dos limitaciones únicas aseguran que un pedido puede pertenecer a un solo cliente y nunca al mismo cliente dos veces.

Si siempre debe normalizar una relación de este tipo es una historia diferente. En algunos casos, la desnormalización puede conducir a implementaciones más simples.


Para establecer una clave foránea que admite nulos o nulo, use la secuencia de comandos sql

ALTER TABLE Return_COMMENTS MODIFY order_ID Number NULL;


Tenemos muchas de estas cosas, ya que nuestra aplicación es algo que comienza con información básica para un evento y con el tiempo, ya que el evento está más planificado, se agrega más información. Pero cuando se agrega la información, queremos asegurarnos de que cumpla con la restricción FK. Los FK son para la integridad de los datos, pero no todos los datos se conocen en el momento en que se insertan los datos iniciales, por lo que se permiten nulos.


Un escenario de diseño común para establecer una columna como nulo es si tiene una relación de uno a muchos padres o hijos, pero los hijos no tienen que estar presentes.

Cuando un registro principal (como una cuenta) tiene hijos que se pueden eliminar (como solicitudes de ayuda), este es un buen uso.

Puede tener una columna para MostRecentRequest que incluya el ID de la solicitud de ayuda más reciente. Cuando la solicitud se elimina del sistema, la columna MostRecentRequest se establece en NULL, lo que significa que no hay ninguna presente.

Otro ejemplo es cuando quiere que NULL signifique que todavía no se ha asignado una matriz a una fila. Quizás tenga solicitudes de ayuda que entren y un NULL en el campo técnico significa que no se asignó tecnología a la solicitud. Cuando elimina a ese técnico, quiere que todo su trabajo incompleto regrese al grupo restableciendo el valor a NULL.


hay, haz una estructura de árbol, una tabla que se relaciona a sí misma. Considera esto:

table_node(node_id, parent_node_id, name)

Para la raíz, parent_node_id debe ser nulo, ¿verdad?