В чем истинная причина ошибки mysql 1442? - PullRequest
6 голосов
/ 20 июля 2011

ну я искал много мест в интернете по причине 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?

1 Ответ

4 голосов
/ 20 июля 2011

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

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

Из Документы MySQL:

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