2011-05-18 1 views
20

У меня есть таблица «A» в MySQL. В нем есть некоторые ссылки с каскадным удалением на некоторые другие таблицы («B», «C», «D» ...). Мне нужно использовать триггер, когда что-то удаляет из «А». Этот триггер работает, когда я удаляю записи из «А» напрямую. Но это не работает с каскадным удалением. Существует ли какая-либо версия MySQL, где мой триггер будет работать с удалением каскада? Или, может быть, есть другой способ вызоваТриггерные вызовы при каскадном удалении

+1

Это аргумент для выполнения логики в коде приложения, а не для сложной настройки триггеров и каскадирования. –

ответ

22

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

каскадные внешнего ключа действия не активировать триггеры

Другими словами, вы не можете использовать триггер с каскадируемой стиранию.

+37

i hate mysql больше каждый день –

+1

Да, они ничего не сделали, чтобы исправить это за последние 5 (?) Лет. – boreq

+1

Я только что нашел эту проблему, и она в высшей степени немой :-( –

4

Суммируя ответы от @Niel де Вет и @Browny Лин:

  1. К сожалению каскадных удалений не активировать триггеры в MySQL.
  2. Одним из решений является не использовать каскадные удаления, а вместо этого осуществлять автоматическое удаление с помощью другого триггера.
+1

с использованием другого триггера для удаления не является правильным подходом, потому что если у меня есть триггер на tableA и удаляю строку в таблицеB, а также если у меня есть триггер aon tableB для обновления таблицы A, то столкновение – 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

Это прямая копия комментария от http://dev.mysql.com/doc/refman/5.7/en/innodb-foreign-key-constraints.html. – hichris123

+1

Это, похоже, не пытается ответить го e вопрос вообще. – Pang

1

Позвольте мне рассказать, как я «фиксации» этот вопрос с первого дня, когда я обнаружил, что существует. Я копирую триггер из каскадной таблицы в первую таблицу, которая удаляется напрямую. Это просто работает.

Много раз это вопрос копирования/вставки, и иногда это требует обширной перезаписи кода.

Лучшая часть, когда Oracle, наконец, исправляет ошибку Ошибка, вы удалили только код запуска из указанной таблицы. Вуаля!