sql >> Base de Datos >  >> RDS >> Mysql

Por qué usar claves foráneas sin acción de eliminar o actualizar

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 como user_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 como file.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.