MySQL: обновить таблицу в своем собственном триггере - PullRequest
4 голосов
/ 28 июня 2011

Очевидно, что 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 (из соображений производительности), поэтому не могу использовать внешние ключи.

1 Ответ

4 голосов
/ 28 июня 2011

Не можете ли вы добавить внешний ключ с помощью ON DELETE SET NULL (or DEFAULT)?
ОБНОВЛЕНИЕ (DEFAULT все еще не реализовано; SET NULL - единственный вариант ...)
Итаку вас будет что-то вроде

create table folder(
id int unsigned not null auto_increment PRIMARY KEY ,
name varchar(100) not null ,
parentId int unsigned null ,
FOREIGN KEY(parentId) REFERENCES folder(id) ON UPDATE CASCADE ON DELETE SET NULL      
) ;
...