Невозможно обновить таблицу «example_table» в хранимой функции / триггере, потому что она уже используется оператором, который вызвал эту хранимую функцию / триггер - PullRequest
1 голос
/ 14 марта 2019

Я пытаюсь написать очень простой запрос.Я не смог решить эту проблему.

Мой триггер:

CREATE TRIGGER `example_trigger` AFTER UPDATE ON `example_table`
FOR EACH ROW
if (new.result = 1) THEN
update  example_table set result = 2 where result=0 and costumer_id = new.costumer_id;
end if;

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

Can't update table 'example_table' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.

Я пытался написать процедуру, но она снова не сработала.

Как я могу решить эту проблему?

Редактировать:

Пример таблицы:

id   customer_id    result
1         12           0
2         12           5
3         14           4
4         12           3
5         12           0
6         12           0
7         16           3

Запрос:

UPDATE example_table SET result=1 WHERE customer_id=12 AND id=4

Тогда сработает триггер.

И мне нужно:

   id   customer_id    result
    1         12           2      ->trigger
    2         12           5
    3         14           4
    4         12           1      ->update
    5         12           2      ->trigger
    6         12           2      ->trigger
    7         16           3

1 Ответ

0 голосов
/ 14 марта 2019

Сначала запустите show triggers; из cli или из MySQL Workbench , чтобы увидеть, есть ли у вас триггер с именем example_trigger или есть какие-либо триггеры, установленные для AFTER UPDATE ON example_table .

У вас может быть только 1 триггер с именем example_trigger и только 1 триггер для AFTER UPDATE ON example_table.

Затем, изменение кода на следующее должно решить вашу проблему:

DROP TRIGGER example_trigger;

DELIMITER $$

CREATE TRIGGER `example_trigger` BEFORE UPDATE ON `example_table`
FOR EACH ROW
BEGIN

IF (NEW.result = 1) THEN
    SET NEW.result = 2;
END IF;

END $$

DELIMITER ;

В своем коде вы задаете условие IF result=1, а затем WHERE result=0 в операторе обновления. Это приведет к тому, что ваш триггер никогда ничего не обновит (или не выдаст ошибки). Кроме того, вы можете значительно упростить свой код, используя BEFORE UPDATE, как в моем примере, поскольку вы можете просто SET NEW.col = x вместо того, чтобы выполнять весь оператор UPDATE.

Кроме того, вы неправильно написали "клиент":)

Обновление

Вы можете использовать оператор CASE для достижения этого с помощью одного запроса UPDATE. Обратите внимание, что для этого вам придется отключить «безопасные обновления».

SET SQL_SAFE_UPDATES = 0;

UPDATE example_table 
SET result = CASE
    WHEN id=4 THEN 1
    WHEN result=0 THEN 2
    ELSE result
    END WHERE customer_id = 12;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...