¿Cuál es el propósito de SET NULL en las restricciones Eliminar / Actualizar claves externas?

15

Probablemente estoy siendo de mente estrecha, pero si creo una restricción de clave externa y una fila se actualiza o elimina, pierdo esa conexión si la columna de la tabla secundaria se establece en NULL.

¿Cuál es el propósito de mantener intencionalmente estas filas huérfanas?

Derek Downey
fuente
Estoy buscando casos de uso, y no creo que sean específicos de la base de datos (podría estar equivocado aquí)
Derek Downey
Nunca he visto un caso de uso para esto ...
a_horse_with_no_name

Respuestas:

13

Si set nulles útil o no depende de lo que haya elegido nullsignificar en el contexto particular: con toda la confusión y la opinión en torno a la nullOMI, el enfoque sensato es que el DBA

  1. Elija (y documente) lo que significa para cada campo anulable
  2. Asegúrate de que solo signifique una cosa

Con esas reglas, considere el siguiente caso de uso:

  • Tiene una mesa 'tienda' (por ejemplo, locales individuales)
  • Tienes una mesa 'minorista' (p. Ej. Cadenas)
  • La tabla 'comprar' tiene un campo de búsqueda que hace referencia a la clave de 'minorista'
  • Ha definido nullrepresentar una tienda independiente (es decir, una que no forma parte de una cadena)
  • Un 'minorista' cierra sucursales hasta el punto de que considera que sus tiendas son independientes

En este caso, on delete set nulltiene sentido. Hay otras formas de modelar estas reglas comerciales, pero esta es la más simple y si se ajusta con precisión a los hechos que le interesan en el mundo real, sugiero que esté perfectamente bien

Jack dice que intente topanswers.xyz
fuente
Puntos buenos con un significado estricto de nulo, y con su ejemplo está claro por qué esta es una característica.
Derek Downey
1

La mayoría de los casos de uso que se me ocurren en general son de la forma "Bueno, podríamos hacer algo diferente, pero teníamos ganas de hacerlo".

Considere un ownercampo para un error en un sistema de seguimiento de problemas en una empresa. Si John renuncia, seguramente todos sus problemas no deberían simplemente eliminarse cuando se elimina su cuenta. Incluso entonces, algunas bases de datos lo permiten SET DEFAULTcomo acción (o hacer que un disparador realice la misma tarea), y que un Nobodyempleado sea el propietario predeterminado de los problemas podría ser una opción. O podríamos tener un disabledcampo para John en lugar de eliminar su registro.

DerfK
fuente
3
En este caso, argumentaría que no permitiría eliminar ( RESTRICT), ¡si no por otra razón que señalar la culpa a un viejo empleado cuando algo sale mal!
Derek Downey