Al utilizar tablas InnoDb (para exigir integridad referencial), los SGBD suelen ofrecer cuatro (o cinco) comportamientos ante el borrado/actualización de los registros referenciados:
- CASCADE / en cascada.- Borrando o actualizando el registro referenciado (en la tabla padre), se borra/actualiza el registro en la tabla hija. Access avisa de que se van a borrar datos. Mysql no.
- NO ACTION /sin acción .- No deja borrar/actualizar si existen registros en la tabla hija que hagan referencia al registro a borrar (en Mysql es equivalente a RESTRICT)
- SET NULL/ poner a nulo.- Pone a null el registro que hace referencia
- SET DEFAULT/poner al valor por defecto.- Pone al valor por defecto el registro que hace referencia
Pues bien, MySQL no permite la última opción, el SET DEFAULT.
Cuesta encontrar un ejemplo claro en el que sea útil esta opción pero podría ser algo como una tabla de coches con un campo conductor (clave ajena de la tabla conductor), con default ‘Libre’ y con null indicando lo que debe (que no se conoce o no es aplicable ningún valor).
Al borrar un conductor, se sabe que está libre y se debería poner a DEFAULT.
Este ejemplo no es correcto, ya que obliga a añadir un conductor fantasma, el Libre. Una solución más correcta sería añadir un booleano que indique si está libre o no el coche.
A ver si se me ocurre algún ejemplo.
Claro, en internet se dan ejemplos para ver cómo funciona pero estoy interesado en un ejemplo “real” en el que sea útil.