Creo que estás malinterpretando lo que ON DELETE NO ACTION
significa. no significa suprimir la restricción de clave externa.
Cuando elimina un registro al que hace referencia una clave externa, InnoDB tiene la capacidad de tomar una acción automática para rectificar la situación:
- puede
CASCADE
, es decir, eliminar el registro de referencia. (Esto tendría sentido para algo comouser_address.user_id
. Si elimina de forma permanente a un usuario, probablemente también desee eliminar de forma permanente todas las direcciones del usuario). - puede
SET NULL
, es decir, borrar la clave de referencia. (Esto podría tener sentido para algo comofile.last_modified_by
. Si elimina definitivamente a un usuario, es posible que desee que la última modificación del archivo sea simplemente "desconocida".)
Si especifica NO ACTION
, le está diciendo a InnoDB que no desea que realice ninguna de estas acciones. Por lo tanto, InnoDB no puede solucionar la situación por usted; todo lo que puede hacer es rechazar el DELETE
y devolver un error.
Como resultado, ON DELETE NO ACTION
es en realidad lo mismo que ON DELETE RESTRICT
(el valor predeterminado).
(Nota:en algunos DBMS y en SQL estándar, ON DELETE NO ACTION
es un poco diferente de ON DELETE RESTRICT
:en esos, ON DELETE NO ACTION
significa "aceptar el DELETE
dentro de la transacción actual, pero rechazo toda la transacción si trato de confirmarla antes de corregir el problema". Pero InnoDB no admite cheques diferidos, por lo que trata ON DELETE NO ACTION
exactamente lo mismo que ON DELETE RESTRICT
, y siempre rechaza el DELETE
inmediatamente .)
Ver §§14.2.2.5 "FOREIGN KEY Restricciones" y 13.1.17.2 "Uso de restricciones FOREIGN KEY " en el Manual de referencia de MySQL 5.6.