Какова реальная причина ошибки mysql 1442?

ну, я искал много мест в Интернете по причине mysql error #1442 которая гласит:

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

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

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

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

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

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

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

теперь у меня есть after update trigger в 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? 

Вы не можете ссылаться на таблицу при ее обновлении.

 /* my sql does not support this */ UPDATE tableName WHERE 1 = (SELECT 1 FROM tableName) 

Из документов MySQL:

Триггер может получать как старые, так и новые данные в своей таблице. Триггер также может влиять на другие таблицы, но не разрешается изменять таблицу, которая уже используется (для чтения или записи) оператором, вызывающим функцию или триггер. (До MySQL 5.0.10 триггер не может изменять другие таблицы.)

Interesting Posts

Как включить режим выбора столбцов в Eclipse?

Преобразование строки base64 в изображение

Создавать инкрементные / полные резервные копии с полностью зашифрованного диска с использованием TrueCrypt?

Лучшая практика сохранения настроек приложения в приложении Windows Forms

почему отсутствует серверный сервер, установленный в режиме онлайн / офлайн?

Почему большинство пользовательских интерфейсов однопоточных?

Включен ли MySQL в MAMP без файла конфигурации?

Как пакеты IP-ответа достигают своего адресата внутри частной локальной сети?

Что делает крипт (3) и еще что означает

Прелесть тернарного оператора против оператора if

Получить список имен полей из classа case

Автоматический повторный набор для VPN-соединений PPTP в Windows 8

Взломайте Chrome, чтобы показать свои внутренние страницы с черным фоном

Как размер файла равен нулю?

Как восстановить удаленный файл в Mac?

Давайте будем гением компьютера.