una tabla poner llaves llave incorrectly formed foreign foraneas foranea error eliminar definir crear creada constraint compuesta como agregar mysql foreign-keys

tabla - MySql Claves foráneas: ON DELETE NO ACTION behavour-¿cómo dejar la información en el campo de referencia?



definir llaves foraneas en mysql (2)

Tengo dos tablas, una de ''usuarios'' y una de ''pedidos'', donde la tabla de orden tiene una referencia de clave externa a la tabla de identificación de usuario. (Estoy usando la dirección de correo electrónico como identificación de usuario en este caso).

Lo que quiero lograr es esto:

  1. Si el ID de la tabla de usuario se actualiza (= la dirección de correo electrónico se modifica), esto se reflejará en el campo de ID de usuario de la tabla de orden a la que se hace referencia. (Esto funciona bien usando la directiva ON UPDATE CASCADE - ¡no hay problema aquí!)

  2. Si el usuario se elimina de la tabla de usuarios, el orden se mantendrá, MANTENIENDO el ID de usuario referenciado.

Estoy teniendo problemas con el segundo objetivo:

Si utilizo ON DELETE CASCADE en el campo de ID de usuario referenciado, la fila de orden, por supuesto, se elimina.

Si utilizo ON DELETE NO ACTION, aparece un error cuando intento eliminar al usuario. (# 1451 - No se puede eliminar o actualizar una fila principal: falla una restricción de clave externa)

Si uso ON DELETE SET NULL, puedo eliminar la fila del usuario, pero la información a la que se hace referencia está configurada en nula, por lo que no puedo encontrar quién hizo ese pedido ...

¿Hay alguna forma de permitir la eliminación del usuario de la tabla de usuarios mientras se mantiene la información de ID de usuario a la que se hace referencia en la tabla de pedidos?


Dos opciones:

  • No elimine realmente al usuario, simplemente márquelo como eliminado configurando un campo deleted .

o:

  • Eliminar la restricción de clave externa.

Recomendaría la primera opción. Tomar la segunda opción puede llevar a inconsistencias de datos. Además, el solo hecho de tener el valor de la clave sin los datos correspondientes en la otra tabla no le ayudará mucho de todos modos.


En realidad, hay otra alternativa: reemplazar la clave de la dirección de correo electrónico de la tabla de usuario con un INT de autoincremento.

Luego, simplemente puede copiar el atributo de usuario (ugh, desnormalizado) en el pedido (supongo que podría justificarlo como la ''dirección de correo electrónico del usuario que realiza el pedido en el momento del pedido'').

Luego, ON DELETE SET NULL podría restablecer la clave foránea INT pero no el atributo copiado (dirección de correo electrónico).