Как избежать циклических триггерных зависимостей в MySQL - PullRequest
4 голосов
/ 05 марта 2012

У меня небольшая проблема с использованием триггеров в MySQL.

Предположим, у нас есть 2 таблицы:

  • TableA
  • TableB

И 2 триггера:

  • TriggerA: срабатывает при удалении в TableA и обновляет TableB
  • TriggerB: срабатывает при удалении в TableB и удаляет в TableA

Проблема заключается в том, что когда я удаляю несколько строк в TableB, TriggerB запускает и удаляет некоторые элементы в TableA, затем TriggerA запускает и пытается обновить TableB.

Не удается, потому что TriggerA пытается обновить некоторые строки в TableB,удалено.

Как мне избежать этой циклической зависимости?

Ни один из этих двух триггеров не является бесполезным, поэтому я не знаю, что я должен делать, чтобы решить эту проблему.

1 Ответ

9 голосов
/ 05 марта 2012

Попробуйте использовать переменную.

Первый триггер:

CREATE TRIGGER trigger1
  BEFORE DELETE
  ON table1
  FOR EACH ROW
BEGIN
  IF @deleting IS NULL THEN
    SET @deleting = 1;
    DELETE FROM table2 WHERE id = OLD.id;
    SET @deleting = NULL;
  END IF;
END

Второй триггер:

CREATE TRIGGER trigger2
  BEFORE DELETE
  ON table2
  FOR EACH ROW
BEGIN
  IF @deleting IS NULL THEN
    SET @deleting = 1;
    DELETE FROM table1 WHERE id = OLD.id;
    SET @deleting = NULL;
  END IF;
END

И дополнительные триггеры AFTER DELETE:

CREATE TRIGGER trigger3
  AFTER DELETE
  ON table1
  FOR EACH ROW
BEGIN
  SET @deleting = NULL;
END

CREATE TRIGGER trigger4
  AFTER DELETE
  ON table2
  FOR EACH ROW
BEGIN
  SET @deleting = NULL;
END
...