2011-05-18 10 views
20

Ho tabella "A" in MySQL. Ha alcuni riferimenti con l'eliminazione a cascata di alcune altre tabelle ("B", "C", "D" ...). Devo usare un trigger quando qualcosa cancella da "A". Questo trigger funziona quando elimino i record direttamente da "A". Ma non funziona con l'eliminazione a cascata. Esiste qualche versione di MySQL dove il mio trigger funzionerà con l'eliminazione a cascata? O, forse, c'è un altro modo per chiamareTrigger chiama in cascata cancellando

+1

Questo è un argomento per eseguire la logica nel codice dell'applicazione, non una configurazione complessa di Trigger e Cascading. –

risposta

22

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

in cascata azioni chiave stranieri non attivano i trigger

In altre parole, non è possibile utilizzare il grilletto con eliminazione in cascata.

+37

odio mysql di più ogni giorno –

+1

Sì, non hanno fatto nulla per sistemarlo negli ultimi 5 (?) Anni. – boreq

+1

Ho appena trovato questo problema ed è estremamente stupido :-( –

4

di riassumere le risposte da @Niel de Wet e @Browny Lin:

  1. eliminazioni Purtroppo in cascata non attivano i trigger in MySQL.
  2. Una soluzione consiste nel non utilizzare eliminazioni a cascata, ma implementare l'eliminazione automatica tramite un altro trigger.
+1

utilizzando un altro trigger per l'eliminazione non è un approccio corretto. Perché se ho un trigger su tableA e cancella una riga in tableB, e anche If I have a trigger aon tableB per l'aggiornamento tableA, quindi una collisione – 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

Questa è una copia diretta di un commento da http://dev.mysql.com/doc/refman/5.7/en/innodb-foreign-key-constraints.html. – hichris123

+1

Questo non sembra tentare di rispondere esimo e domanda a tutti. – Pang

1

Permettetemi di condividere quanto ho "fissare" il problema dal primo giorno ho scoperto che esisteva. Copio il trigger dalla tabella in cascata nella prima tabella che viene cancellata direttamente. Funziona e basta.

Un sacco di volte si tratta di una copia/incolla, e occasionalmente richiede un'estesa riscrittura del codice.

La parte migliore è che, quando Oracle risolve questo errore , è stato rimosso solo il codice di attivazione dalla tabella. Ecco!