какова настоящая причина ошибки mysql 1442?

хорошо Я искал много мест в Интернете, чтобы найти причину ошибки mysql # 1442 , в которой говорится:

Невозможно обновить таблицу unlucky_table в сохраненной функции / триггере, потому что он уже используется оператором, который вызвал это сохраненное function / trigger

Некоторые говорят, что это ошибка mysql или функция, которую он не предоставляет.

Триггеры MySQL не могут управлять таблицей, которой они назначены. Все другие основные СУБД поддерживают эту функцию, поэтому, надеюсь, MySQL скоро добавит эту поддержку.

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

Во время вставки / обновления у вас есть доступ к НОВОМУ объекту который содержит все поля таблицы. Если вы выполните перед вставкой / обновлением и отредактируете поля, которые вы хотите изменить в новом объекте, оно станет частью вызывающего оператора и не будет выполняться отдельно (устраняя рекурсию)

now i не могу понять, почему это рекурсивно. У меня есть случай, когда у меня есть 2 таблицы table1 и table2 , и я запускаю запрос sql как

update table1 set avail = 0 where id in (select id from table2 where duration < now() - interval 2 hour);

, теперь у меня есть после триггера обновления на table1 как

CREATE TRIGGER trig_table1 AFTER UPDATE ON table1
FOR EACH ROW begin
if old.avail=1 and new.avail=0 then
delete from table2 where id=new.id;
end if;

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

is this error a lack of feature in mysql?
OR
does this have to do with how mysql executes queries?
OR
is there something logically wrong with executing such queries?

6
задан Community 23 May 2017 в 12:24
поделиться