update foreign fails constraint child cannot mysql phpmyadmin innodb relational-database

foreign - fk en mysql phpmyadmin



Configurando las relaciones de la tabla, ¿qué hacen "Cascade", "Set Null" y "Restrict"? (2)

Quiero comenzar a usar relaciones de tabla en un nuevo proyecto.

Después de buscar en Google obtuve 2 tablas configuradas como InnoDB:

Las claves que quiero vincular son

-> usuarios-> ID de usuario (primario) -> sesiones-> ID de usuario (índice)

Lo único que no entiendo en este proceso es qué hacen las diferentes configuraciones para "En actualización" y "En borrar"

Las opciones aquí son:

  • -- (¿nada?)
  • Cascada (???)
  • Establecer nulo (establece todo en nulo?)
  • Sin acción (bueno, duh ...)
  • Restringir (???)

Básicamente, quiero que los datos en las sesiones se eliminen cuando un usuario se elimine por completo, ya que las sesiones solo se eliminarán cuando el administrador de sesión detecte la caducidad ...

Entonces, si alguien puede decirme qué hacen estas opciones, sería muy apreciado.


La tabla que contiene la clave externa se denomina tabla de referencia o secundaria , y la tabla que contiene la clave candidata se denomina tabla principal o referenciada .

Establecer NULL : establece el valor de la columna en NULL cuando elimina la fila de la tabla padre.

CASCADA : CASCADE propagará el cambio cuando el padre cambie. Si elimina una fila, las filas en las tablas restringidas que hacen referencia a esa fila también se eliminarán , etc.

RESTRICT : RESTRICT hace que no pueda eliminar una fila principal dada si existe una fila secundaria que haga referencia al valor de esa fila principal.

NO ACCIÓN : NO ACCIÓN y RESTRICTO son muy parecidos. cuando se ejecuta una instrucción UPDATE o DELETE en la tabla referenciada, el DBMS verifica al final de la ejecución de la declaración que no se viola ninguna de las relaciones referenciales . en resumen, el hijo no tiene problema si la fila principal se elimina o actualiza .


CASCADE propagará el cambio cuando el padre cambie. (Si elimina una fila, las filas de las tablas restringidas que hacen referencia a esa fila también se eliminarán, etc.)

SET NULL establece el valor de la columna en NULL cuando una fila principal desaparece.

RESTRICT hace que el intento DELETE de una fila primaria falle.

EDIT: no preguntaste sobre ellos, pero el estándar SQL define otras dos acciones: SET DEFAULT y NO ACTION . En MySQL, NO ACTION es equivalente a RESTRICT . (En algunos DBMS, NO ACTION es un cheque diferido, pero en MySQL todas las comprobaciones son inmediatas). El analizador MySQL acepta SET DEFAULT , pero tanto el motor InnoDB como el NDB rechazan esas declaraciones, por lo que SET DEFAULT no se puede usar para ninguno una ON UPDATE o una restricción ON DELETE .

Además, tenga en cuenta que las acciones de la clave externa en cascada no activan desencadenantes en MySQL.