este problema se puede resolver de diferentes maneras, sin embargo te dejamos la que en nuestra opinión es la resolución más completa.
Solución:
Un muy buen hilo sobre este tema se puede encontrar aquí y también aquí. La guía definitiva para MySQL es, por supuesto, la documentación, que se encuentra aquí.
En el estándar SQL 2003 hay 5 acciones referenciales diferentes:
- CASCADA
- RESTRINGIR
- NO HAY ACCION
- SET NULL
- ESTABLECER PREDETERMINADO
Para responder a la pregunta:
-
CASCADA
-
ON DELETE CASCADE
significa que si se elimina el registro principal, también se eliminarán los registros secundarios. Este es no una buena idea en mi opinión. Debe realizar un seguimiento de todos los datos que alguna vez han estado en una base de datos, aunque esto se puede hacer usandoTRIGGER
s. (Sin embargo, vea la advertencia en los comentarios a continuación). -
ON UPDATE CASCADE
significa que si el padre primario key cambia, el valor secundario también cambiará para reflejarlo. De nuevo, en mi opinión, no es una gran idea. Si estas cambiandoPRIMARY KEY
s con cierta regularidad (¡o incluso en absoluto!), hay algo mal en su diseño. Nuevamente, vea los comentarios. -
ON UPDATE CASCADE ON DELETE CASCADE
significa que si tuUPDATE
ODELETE
padre, el cambio se transmite en cascada al hijo. Este es el equivalente deAND
los resultados de las dos primeras declaraciones.
-
-
RESTRINGIR
RESTRICT
significa que cualquier intento de eliminar y / o actualizar el padre fallará y arrojará un error. Este es el comportamiento predeterminado en el caso de que no se especifique explícitamente una acción referencial.
Por un
ON DELETE
oON UPDATE
que no se especifica, la acción predeterminada es siempre RESTRICT`.
-
NO HAY ACCION
NO ACTION
: Del manual. Una palabra clave de SQL estándar. En MySQL, equivalente aRESTRICT
. El servidor MySQL rechaza la operación de eliminación o actualización de la tabla principal si hay un elemento externo relacionado. key valor en la tabla referenciada. Algunos sistemas de bases de datos tienen comprobaciones diferidas yNO ACTION
es un cheque diferido. En MySQL, extranjero key las restricciones se comprueban inmediatamente, por lo queNO ACTION
es lo mismo queRESTRICT
.
-
SET NULL
SET NULL
– nuevamente del manual. Elimine o actualice la fila de la tabla principal y configure el externo key columna o columnas en la tabla secundaria paraNULL
. En mi humilde opinión, esta no es la mejor de las ideas, principalmente porque no hay forma de “viajar en el tiempo”, es decir, mirar hacia atrás en las tablas secundarias y asociar registros conNULL
s con el registro principal relevante, ya seaCASCADE
o usarTRIGGER
s para completar las tablas de registro para realizar un seguimiento de los cambios (pero, consulte los comentarios).
-
ESTABLECER PREDETERMINADO
SET DEFAULT
. ¡Otra parte (potencialmente muy útil) del estándar SQL que MySQL no se ha molestado en implementar! Permite al desarrollador especificar un valor al que establecer el valor externo. key columna (s) en una ACTUALIZACIÓN o BORRAR. InnoDB y NDB rechazarán las definiciones de tabla con unSET DEFAULT
cláusula.
Como se mencionó anteriormente, debería dedicar un tiempo a consultar la documentación, aquí.
Estas dos son acciones que se deben realizar, respectivamente, cuando el registro al que se hace referencia en la tabla principal cambia su identificación y cuando se elimina.
Si ejecuta:
UPDATE parent SET id = -1 WHERE id = 1;
Y hay al menos un registro en child
con parent_id = 1
, 1) fallará; en los casos 2) y 3), todos los registros con parent_id = 1 se actualizan a parent_id = -1.
Si ejecuta:
DELETE FROM parent WHERE id = 1;
Y hay al menos un registro en child
con parent_id = 1
, 2) fallará; en los casos 1) y 3), todos los registros con parent_id = 1
se eliminan.
3) es sintácticamente correcto.
La documentación completa se puede encontrar en el manual.
No tengo suficiente reputación para comentar las respuestas anteriores. Así que pensé en elaborar un poco.
1) ON DELETE CASCADE significa que si se elimina el registro principal, también se eliminarán los registros secundarios de referencia. ON UPDATE tiene como valor predeterminado RESTRICT, lo que significa que la ACTUALIZACIÓN en el registro principal fallará.
2) La acción ON DELETE tiene como valor predeterminado RESTRICT, lo que significa que el DELETE en el registro principal fallará. ON UPDATE CASCADE actualizará todos los registros secundarios de referencia cuando se actualice el registro principal.
3) Ver las acciones de CASCADE en 1) y 2) arriba.
Sobre el uso de ID de registro principal como extranjeros keys (en tablas secundarias) – la experiencia dice a) si los ID son números de secuencia generados automáticamente, NO los use como foráneos keys. Utilice algún otro padre único key en lugar de. b) si los ID son GUID, entonces está bien usarlos como extranjeros keys. Verá la sabiduría de esta sugerencia cuando exporte e importe los registros o los copie a otra base de datos. Es demasiado engorroso lidiar con números de secuencia generados automáticamente durante la migración de datos cuando se hace referencia a ellos como externos keys.
Sección de Reseñas y Valoraciones
Acuérdate de que puedes optar por la opción de agregar una reseña si te fue de ayuda.