Не удается обновить таблицу, для которой выполняется триггер в AFTER INSERT - PullRequest
4 голосов
/ 10 февраля 2012

Я использую MySQL 5.5.9 и InnoDB.

Я пытаюсь создать версионную таблицу, где поле current указывает, является ли запись самой последней версией. Что-то вроде:

| autonumber | id | name | current
| 1          | 1  | Yes  | 0
| 2          | 1  | No   | 1

Во всяком случае, раньше я делал это в MSSQL довольно часто через триггер AFTER INSERT, который обновляет все записи с одинаковым идентификатором до current = 0. Итак, мы идем в MySQL:

DELIMITER |

CREATE TRIGGER TRIGGER_Products_UpdateEarlierVersions AFTER INSERT ON Products
FOR EACH ROW BEGIN
    UPDATE Products
    SET current = 0
    WHERE   id = new.id
        AND current = 1
        AND autonumber <> new.autonumber;
END;
|

Это работает нормально, но при вставке записи:

insert into Products (id, name)
values (1, "Hello SO!");

Я получаю следующую ошибку:

Код ошибки: 1442. Невозможно обновить таблицу «Продукты» в сохраненной функции / триггере, поскольку она уже используется оператором, который вызвал эту сохраненную функцию / триггер.

Есть ли способ обойти подобную вещь?

Ответы [ 3 ]

3 голосов
/ 10 февраля 2012

Взято отсюда http://forums.mysql.com/read.php?99,122354,122505#msg-122505

, когда вы вставляете запись, mysql выполняет некоторые блокировки.Вы не можете вставлять / обновлять / удалять строки той же таблицы, куда вы вставляете .. потому что тогда триггер будет вызываться снова и снова .. заканчивая рекурсией

1 голос
/ 07 июня 2015

когда вы вставляете запись, mysql делает что-то блокирующее. вы не можете вставлять / обновлять / удалять строки той же таблицы, куда вы вставляете ... потому что тогда триггер будет вызываться снова и снова .. заканчивая рекурсией

Раньше у меня была эта проблема. Я удалил команду обновления. Итак, попробуйте это:

DELIMITER |

CREATE TRIGGER TRIGGER_Products_UpdateEarlierVersions AFTER INSERT ON Products
FOR EACH ROW BEGIN

    SET current = 0
    WHERE   id = new.id
        AND current = 1
        AND autonumber <> new.autonumber;
END;
|

Я думаю, это сработает

0 голосов
/ 10 февраля 2012

В MySQL невозможно обновить таблицу («Продукты»), для которой в триггере создан триггер.

Согласно документации MySQL, эта ошибка генерируется для предотвращения бесконечной рекурсии: при возникновении UPDATE запускается триггер и обновляется таблица, этот триггер UPDATE вызывает повторный запуск триггера, и сновазаканчивается бесконечным циклом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...