Очевидно, что MySQL имеет действительно раздражающее ограничение, заключающееся в невозможности обновления таблицы внутри триггера, определенного для этой же таблицы.
Я использую MySQL версии 5.1 и получаю сообщение об ошибке: " Не могуобновите таблицу в сохраненной функции / триггере, потому что она уже используется оператором, который вызвал эту функцию / триггер".
Что у меня есть:
create table folder(
id int unsigned not null auto_increment PRIMARY KEY ,
name varchar(100) not null ,
parentId int unsigned not null
) ;
Это иерархическая папкасостав.У папки есть имя и, возможно, родительская папка (если нет, то parentId
равно нулю).
Когда папка удалена, мне нужно изменить parentId
всех подпапок, которые были внутри нее, чтобы они нене могут стать потомками несуществующей папки.
Это довольно просто (почти тривиально):
CREATE DEFINER=root@localhost TRIGGER onFolderDelete after delete ON folder
FOR EACH ROW update folder set parentId=0 where parentId=old.id ;
Однако такой простой триггер не разрешен MySQL, потому что, как я уже говорил выше, выне может обновить таблицу внутри своего собственного триггера.
Есть ли способ реализовать такой триггер, эмулируя его эффекты каким-либо образом ??
PS: Пожалуйста, не предлагайте отправлять оба оператора в последовательности (УДАЛЕНИЕ и ОБНОВЛЕНИЕ).Это, очевидно, последнее решение, если больше ничего не возможно.
Редактировать:
Я использую движок MyISAM (из соображений производительности), поэтому не могу использовать внешние ключи.