una tabla solucion restricción relacion puede modificar línea llave foranea falla extranjera externa error eliminar deletar creada constraint como clave agregar mysql foreign-keys relationships

mysql - tabla - no puede deletar una línea padre: falla de clave extranjera constraint



Clave foránea de MySQL en eliminar (5)

Estoy tratando de averiguar las relaciones y las opciones de eliminación.

Tengo dos tablas, User y UserStaff , con una relación 1: n de User a UserStaff (un usuario puede tener varios miembros del personal).

Cuando se elimina mi User , quiero eliminar todas las tablas de UserStaff asociadas con ese User . Cuando se elimina mi UserStaff , no quiero que nada le suceda al User . Entiendo que esta es una relación en cascada, pero no estoy seguro de qué manera.

es decir, ¿selecciono la clave foránea existente en mi tabla UserStaff y la hago en cascada, o creo una nueva clave foránea en User y la configuro en cascada?


De Wikipedia :

CASCADA

Siempre que las filas en la tabla maestra (referenciada) se eliminen (resp. Actual), las filas respectivas de la tabla secundaria (referenciada) con una columna de clave externa coincidente también se eliminarán (resp. Actualizada) también. Esto se denomina eliminación en cascada (resp. Actualización [2]).

Aquí, User es la tabla maestra, y UserStaff es la tabla secundaria. Entonces, sí, querrá crear la clave externa en UserStaff , con ON DELETE CASCADE


Ha pasado un tiempo desde que lo usé, pero aquí va (por cierto, uso Toad para MySql, un gran IDE, y también es gratis - http://www.toadworld.com/Freeware/ToadforMySQLFreeware/tabid/561/Default.aspx !)

Debe agregar una restricción a la tabla de usuario. Si tiene una columna de ID (y la clave de ID de usuario extranjera correspondiente en UserStaff), SouceColumn debe ser id, la tabla de destino UserStaff y la columna de destino userid. A continuación, puede configurar la acción OnDelete como ''Cascade''

Las otras opciones se explican por sí mismas: restringir los valores de los límites a los valores en la columna de origen, establecer nulo establece las coincidencias de clave externa en nulo y ninguna acción lo hace, er, nada.

Esto es muy fácil de hacer a través del IDE Toad. Utilicé las herramientas MySqlAdmin durante años, pero recientemente descubrí Toad (¡y también tiene herramientas de comparación y comparación)!


La forma más fácil podría ser hacer dos mesas rápidas y probarlo. Pero como no lo hiciste, puedo decirte que el resultado será que funcionará de la forma que quieras.

Cuando tiene una tabla User y una tabla UserStaff un campo en UserStaff usa una clave externa para hacer referencia a un campo en User ; luego, si elimina un registro de UserStaff que se eliminará sin tener ningún efecto en la tabla de User . Al revés borrará todos los registros relacionados con ese registro.

Versión corta: un campo en UserStaff debe hacer referencia a un campo en User con CASCADE


ON DELETE CASCADE se especifica en la clave externa en la tabla UserStaff . Para obtener información adicional sobre claves externas, la documentación de MySQL tiene una serie de ejemplos. La tabla de User no tiene una clave externa que apunte a UserStaff , por lo que no se verá afectada por los cambios en la tabla de UserStaff .


Si es posible. Debes hacer el FK en la tabla UserStaff. De este modo:

Tabla de usuario

CREATE TABLE `User` ( `Id` int(11) NOT NULL AUTO_INCREMENT, `Name` varchar(255) DEFAULT NULL, PRIMARY KEY (`Id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Tabla de UserStaff

CREATE TABLE `UserStaff` ( `Id` int(11) NOT NULL AUTO_INCREMENT, `UserId` int(11) NOT NULL DEFAULT ''0'', PRIMARY KEY (`Id`), KEY `UserId` (`UserId`), CONSTRAINT `UserStaff_ibfk_1` FOREIGN KEY (`UserId`) REFERENCES `User` (`Id`) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8;