2011-05-18 8 views
20

Tengo la tabla "A" en MySQL. Tiene algunas referencias con eliminación de cascada en algunas otras tablas ("B", "C", "D" ...). Necesito usar un disparador cuando algo se elimina de "A". Este disparador funciona cuando borro registros de "A" directamente. Pero no funciona con la eliminación en cascada. ¿Existe alguna versión de MySQL donde mi desencadenador funcionará con la eliminación en cascada? O, tal vez, no hay otra manera de llamarDesencadenar llamadas en cascada eliminando

+1

Este es un argumento para hacer la lógica en el código de la aplicación, no una configuración compleja de Triggers y Cascading. –

Respuesta

22

De http://dev.mysql.com/doc/refman/5.6/en/innodb-restrictions.html

en cascada acciones clave externa no activan desencadenantes

En otras palabras, no se puede utilizar el gatillo con el borrado en cascada.

+37

odio mysql más todos los días –

+1

Sí, no hicieron nada para solucionarlo en los últimos 5 (?) Años. – boreq

+1

Acabo de encontrar este problema, y ​​es supremamente tonto :-( –

4

Para resumir las respuestas de @Niel de Wet y @Browny Lin:

  1. eliminaciones en cascada Lamentablemente no activan los disparadores en MySQL.
  2. Una solución es no utilizar eliminaciones en cascada, sino implementar la eliminación automática a través de otro desencadenador.
+1

utilizando otro desencadenador para eliminar no es un enfoque adecuado, porque si tengo un desencadenante en la tabla A y elimino una fila en la tabla B, y también si tengo una tabla de activación aB para actualizar la tabla A, entonces una colisión ocurrirá. – Shafizadeh

-2
CREATE TABLE doc (
docID INTEGER NOT NULL AUTO_INCREMENT, 
langCode CHAR(2) NOT NULL, 
title VARCHAR(32), 
PRIMARY KEY (docID, langCode) 
) Type=InnoDB; 

CREATE TABLE author (
authorID INTEGER NOT NULL AUTO_INCREMENT, 
docID CHAR(2) NOT NULL, 
name VARCHAR(32), 
PRIMARY KEY (authorID), 
FOREIGN KEY (docID) REFERENCES doc(docID) ON DELETE CASCADE ON UPDATE CASCADE 
) Type=InnoDB; 
+1

Esta es una copia directa de un comentario de http://dev.mysql.com/doc/refman/5.7/en/innodb-foreign-key-constraints.html. – hichris123

+1

Esto no parece intentar responder th e pregunta en absoluto. – Pang

1

Permítanme compartir la forma en que he estado "arreglar" este problema desde el primer día descubrí que existía. Copio el disparador de la tabla en cascada en la primera tabla que se elimina directamente. Simplemente funciona.

Muchas veces es una cuestión de copiar/pegar, y ocasionalmente requiere una amplia reescritura del código.

La mejor parte es que cuando Oracle soluciona finalmente este error , solo tiene que eliminar el código de activación de dicha tabla. Voila!