trigger - MySQL en eliminar en cascada. Ejemplo de prueba
eliminar registros con foreign key mysql (2)
Respuesta d. es correcto, si y solo si el motor de almacenamiento realmente admite y aplica restricciones de clave externa.
Si las tablas se crean con Engine=MyISAM
, entonces ninguna b. o d. es correcto.
Si las tablas se crean con Engine=InnoDB
, entonces d. es correcto.
NOTA:
Esto es cierto para InnoDB si y solo si FOREIGN_KEY_CHECKS = 1
; Si FOREIGN_KEY_CHECKS = 0
, entonces DELETE
de la tabla principal (foo) no eliminará las filas de la tabla secundaria (foo2) que hacen referencia a una fila eliminada de la tabla principal.
Verifique esto con la salida de SHOW VARIABLES LIKE ''foreign_key_checks''
(1 = ON, 0 = OFF) (El valor predeterminado normal es que esto esté en ON).
La salida de SHOW CREATE TABLE foo
mostrará qué motor utiliza la tabla.
La salida de SHOW VARIABLES LIKE ''storage_engine''
mostrará el motor predeterminado que se usa cuando se crea una tabla y no se especifica el motor.
Me estoy preguntando acerca de esta pregunta de prueba. Preparé el ejemplo yo mismo y lo probé, pero todavía no estoy seguro de la respuesta.
Con lo siguiente:
CREATE TABLE foo (
id INT PRIMARY KEY AUTO_INCREMENT,
name INT
)
CREATE TABLE foo2 (
id INT PRIMARY KEY AUTO_INCREMENT,
foo_id INT REFERENCES foo(id) ON DELETE CASCADE
)
Por lo que puedo ver la respuesta es:
a. Se crean dos tablas
Aunque también hay:
segundo. Si se elimina una fila en la tabla foo2, con un foo_id de 2, la fila con id = 2 en la tabla foo se elimina automáticamente
d. Si se elimina una fila con id = 2 en la tabla foo, se eliminarán todas las filas con foo_id = 2 en la tabla foo2
En mi ejemplo habría utilizado la sintaxis de eliminación:
DELETE FROM foo WHERE id = 2;
DELETE FROM foo2 WHERE foo_id = 2;
Por alguna razón, no pude encontrar ninguna relación entre las tablas, aunque parece que debería haber una. ¿Es posible que haya alguna configuración de MySQL o quizás no se use ON DELETE CASCADE
correctamente en las consultas de creación de tablas? Me quedo pensando ...
Tiene una relación entre dos tablas, está en el comando de creación foo2: ... foo_id int references foo(id) on delete cascade
.
De acuerdo con la referencia de Restricciones de Clave Externa de MySQL :
CASCADA: elimine o actualice la fila de la tabla principal, y elimine o actualice automáticamente las filas coincidentes en la tabla secundaria. Tanto ON DELETE CASCADE como ON UPDATE CASCADE son compatibles.
Además, de acuerdo con la referencia de MySQL Foreign Keys :
Para motores de almacenamiento que no sean InnoDB, es posible al definir una columna usar una cláusula REFERENCES tbl_name (nombre_col), que no tiene ningún efecto real, y sirve solo como una nota o comentario que indica que la columna que está definiendo actualmente está destinada para referirse a una columna en otra tabla .
Por lo tanto, dado que la clave externa es de la tabla secundaria a la tabla principal, hace que foo
sea una tabla principal y foo2
una tabla secundaria, por lo que al eliminar una fila de foo
se eliminarán en cascada foo2
, siempre que use InnoDB o algún otro motor de almacenamiento que admita eso.