2011-06-28 87 views
4

显然,MySQL对于无法在为同一表定义的触发器内更新表的操作非常烦人。
我正在使用MySQL版本5.1并且出现错误:“无法更新存储的函数/触发器中的表,因为它已被调用此函数的语句使用/触发器”。MySQL:在自己的触发器中更新表

我有这样的:

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 [email protected] TRIGGER onFolderDelete after delete ON folder 
FOR EACH ROW update folder set parentId=0 where parentId=old.id ; 

然而,这样一个简单的触发器是不是由MySQL允许的,因为正如我上面所说的,你不能在自己的触发器中更新的表。

是否有任何方式通过以某种方式模仿其效果来实现这种触发器?

P.S .:请不要建议顺序发送两个语句(DELETE和UPDATE)。如果没有别的可能,这显然是最后的解决方案。

编辑:
我使用MyISAM引擎(性能原因),所以我不能使用外键。

回答

4

难道你不能用ON DELETE SET NULL (or DEFAULT)添加外键吗?
UPDATEDEFAULT仍然没有实现;​​是唯一的选择......)
所以,你将有类似

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  
) ; 
+0

我使用的是不支持外键的MyISAM引擎。这是一个高流量的网站,所以MyISAM是由于性能原因而需要的。 – GetFree

+0

好的,但你可能需要在你的问题中指定它.... – a1ex07

+1

另外,我相信你可以有一个INNODB表... – a1ex07